{-# LANGUAGE ScopedTypeVariables #-} main = do lines <- readFile "2.in" putStrLn . show . solve . parseInput . words $ lines where solve = partB parseInput :: [ String ] -> [ (String, Integer) ] parseInput [] = [] parseInput [x] = [] parseInput (x:y:r) = (x, read y) : parseInput r -- solves all lines, returns a string partA :: [(String, Integer)] -> Integer partA = (uncurry (*)) . foldl parseCommand (0,0) where -- (horizontal, vertical) parseCommand (a, b) ("forward", x) = (a + x, b) parseCommand (a, b) ("down", x) = (a, b + x) parseCommand (a, b) ("up", x) = (a, b - x) parseCommand _ _ = (0, 0) partB :: [(String, Integer)] -> Integer partB = (\(x,y,_) -> x * y) . foldl parseCommand (0, 0, 0) where -- (horiz, vert, aim) parseCommand (a, b, c) ("forward", x) = (a + x, b + c * x, c) parseCommand (a, b, c) ("down", x) = (a, b, c + x) parseCommand (a, b, c) ("up", x) = (a, b, c - x) parseCommand _ _ = (0, 0, 0)