#!/usr/bin/env runghc

import Day10
import Data.Array
import Data.IntSet (IntSet)
import qualified Data.IntSet as IntSet

main = interact (show . solve . parse)

countPaths inp = pathsFrom start
  where
    start = IntSet.findMax inpSet + 3

    pathsFrom 0 = 1
    pathsFrom x
      | x < 0 = 0
      | IntSet.member x allowed =
          sum $ map ((!) memo) $ filter (>= 0) $ map ((-) x) [1, 2, 3]
      | otherwise = 0

    inpSet = IntSet.fromList inp
    allowed = IntSet.insert start inpSet

    memo = listArray bnds
      [ pathsFrom i | i <- range bnds ]
    bnds = (0, start)

solve = countPaths