X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=src%2Fadvent11%2Fadvent11.hs;fp=src%2Fadvent11%2Fadvent11.hs;h=dd2bd9e68c5aff5a7b931784f54fc468453ca5f5;hb=c8dd17f67a0e6574e60eba88ca85adde5ad16b69;hp=0000000000000000000000000000000000000000;hpb=85761c8d6f9d0edfbf382c15c47edc7a412f92ee;p=advent-of-code-17.git diff --git a/src/advent11/advent11.hs b/src/advent11/advent11.hs new file mode 100644 index 0000000..dd2bd9e --- /dev/null +++ b/src/advent11/advent11.hs @@ -0,0 +1,36 @@ +import Data.List.Split (splitOn) + +main :: IO () +main = do + text <- readFile "data/advent11.txt" + print $ part1 text + print $ part2 text + +part1 :: String -> Int +part1 = distance . hexPath . splitOn "," + +part2 :: String -> Int +part2 = maximum . map distance . hexPathB . splitOn "," + +hexStep :: (Int, Int) -> String -> (Int, Int) +hexStep (n, ne) s = case s of + "n" -> (n + 1, ne) + "ne" -> (n, ne + 1) + "nw" -> (n + 1, ne - 1) + "s" -> (n - 1, ne) + "se" -> (n - 1, ne + 1) + "sw" -> (n, ne - 1) + _ -> (n, ne) + +hexPath :: [String] -> (Int, Int) +hexPath = foldl hexStep (0, 0) + +hexPathB :: [String] -> [(Int, Int)] +hexPathB = scanl hexStep (0, 0) + +distance :: (Int, Int) -> Int +distance (n, ne) = if n * ne > 0 + then (abs n) + (abs ne) + else smallest + remainder + where smallest = min (abs n) (abs ne) + remainder = max ((abs n) - smallest) ((abs ne) - smallest)