diff --git a/2/navigator.hs b/2/navigator.hs index 5349949..4a71fcd 100644 --- a/2/navigator.hs +++ b/2/navigator.hs @@ -4,10 +4,14 @@ main :: IO () main = do instructions <- getContents putStrLn (solution1 instructions) + putStrLn (solution2 instructions) solution1 :: String -> String solution1 input = show (uncurry (*) (navigate (parseInstructions input))) +solution2 :: String -> String +solution2 input = show (uncurry (*) (navigate2 (parseInstructions input))) + parseInstructions :: String -> [(Int, Int)] parseInstructions instructions = map parseLine (lines instructions) @@ -25,6 +29,15 @@ navigate instructions = sumTuples :: (Int, Int) -> (Int, Int) -> (Int, Int) sumTuples (a, b) (c, d) = (a + c, b + d) +navigate2 :: [(Int, Int)] -> (Int, Int) +navigate2 instructions = + takePosition (foldl navigate (0, 0, 0) instructions) + where + navigate :: (Int, Int, Int) -> (Int, Int) -> (Int, Int, Int) + navigate (horz, depth, aim) (speed, dir) = (horz + speed, depth + aim * speed, aim + dir) + takePosition :: (Int, Int, Int) -> (Int, Int) + takePosition (x,y,_) = (x,y) + -- Tests testInput1 :: String @@ -39,3 +52,6 @@ testInput1 = unlines [ test1 :: String test1 = assert ((solution1 testInput1) == "150") "success" + +test2 :: String +test2 = assert ((solution2 testInput1) == "900") "success"