import Data.List.Split main = do content <- getList <$> getContents let input = changeInput content 12 2 putStrLn (show (compute input input 0)) putStrLn (show (part2 content)) getList :: String -> [Int] getList = map read . splitOn "," changeInput :: [Int] -> Int -> Int -> [Int] changeInput (begin:_:_:input) input1 input2= [begin] ++ [input1] ++ [input2] ++ input func :: [Int] -> Int -> Int -> Int func xs x y = do let input = changeInput xs x y head (compute input input 0) compute :: [Int] -> [Int] -> Int -> [Int] compute (99:_) state index = state compute (op:x:y:z:_) state index = compute (drop newindex state) newstate newindex where sum = if op == 1 then (state !! x) + (state !! y) else (state !! x) * (state !! y) split = splitAt z state newstate = (fst split) ++ [sum] ++ (drop 1 (snd split)) newindex = index + 4 part2 input = [ (i,j) | i <- [1..99], j <- [1..99], func input i j == 19690720 ]