Day 11
[advent-of-code-17.git] / src / advent11 / advent11.hs
1 import Data.List.Split (splitOn)
2
3 main :: IO ()
4 main = do
5 text <- readFile "data/advent11.txt"
6 print $ part1 text
7 print $ part2 text
8
9 part1 :: String -> Int
10 part1 = distance . hexPath . splitOn ","
11
12 part2 :: String -> Int
13 part2 = maximum . map distance . hexPathB . splitOn ","
14
15 hexStep :: (Int, Int) -> String -> (Int, Int)
16 hexStep (n, ne) s = case s of
17 "n" -> (n + 1, ne)
18 "ne" -> (n, ne + 1)
19 "nw" -> (n + 1, ne - 1)
20 "s" -> (n - 1, ne)
21 "se" -> (n - 1, ne + 1)
22 "sw" -> (n, ne - 1)
23 _ -> (n, ne)
24
25 hexPath :: [String] -> (Int, Int)
26 hexPath = foldl hexStep (0, 0)
27
28 hexPathB :: [String] -> [(Int, Int)]
29 hexPathB = scanl hexStep (0, 0)
30
31 distance :: (Int, Int) -> Int
32 distance (n, ne) = if n * ne > 0
33 then (abs n) + (abs ne)
34 else smallest + remainder
35 where smallest = min (abs n) (abs ne)
36 remainder = max ((abs n) - smallest) ((abs ne) - smallest)