module Main where import Data.Maybe import Data.List.Split import qualified Data.Map as M run :: [Int] -> Int -> [Int] -> Int run ls start input = fst $ foldl fn (start, startMap) ls where startMap = M.fromList $ zip input [1..] fn (last, seen) i = (i - last', seen') where last' = fromMaybe i (M.lookup last seen) seen' = M.insert last i seen main :: IO () main = do n <- map read . splitOn "," <$> readFile "input/15" -- holy off-by-one errors print $ run [8..2020 - 1] 0 n print $ run [8..30000000 - 1] 0 n