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)