From c6e23b9dac455ee34b4a5df41247cf8e7525a934 Mon Sep 17 00:00:00 2001 From: Gattix Date: Sat, 9 Dec 2023 20:45:02 +0100 Subject: [PATCH] day08: interactify --- 2023/day08/day08.hs | 21 ++++++++++++--------- 2023/day08/testinput2 | 1 + 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/2023/day08/day08.hs b/2023/day08/day08.hs index daffb3e..ce77911 100644 --- a/2023/day08/day08.hs +++ b/2023/day08/day08.hs @@ -7,14 +7,12 @@ import qualified Data.Map as M type LR a = (a, a) -> a -main :: IO () -main = do - (directions, input) <- parse . lines <$> readFile "input" - print $ day08a directions input "AAA" - let starts = filter ((== 'A') . last) (M.keys input) - print $ day08b directions input starts +type Tunnels = M.Map String (String, String) -parse :: [String] -> ([LR String], M.Map String (String, String)) +main :: IO () +main = interact $ show . day08 . parse . lines + +parse :: [String] -> ([LR String], Tunnels) parse = cycle . map @@ -30,9 +28,14 @@ parseLine s = (a, (b, c)) where [a, b, c] = wordsBy (not . isAlphaNum) s -day08a :: [LR String] -> M.Map String (String, String) -> String -> Int +day08 :: ([LR String], Tunnels) -> (Int, Int) +day08 (lrs, m) = day08a lrs m *** day08b lrs m $ ("AAA", starts) + where + starts = filter ((== 'A') . last) (M.keys m) + +day08a :: [LR String] -> Tunnels -> String -> Int day08a _ _ [_, _, 'Z'] = 0 day08a (lr:lrs) m pos = 1 + day08a lrs m (lr (m M.! pos)) -day08b :: [LR String] -> M.Map String (String, String) -> [String] -> Int +day08b :: [LR String] -> Tunnels -> [String] -> Int day08b lrs m starts = foldr1 lcm $ map (day08a lrs m) starts diff --git a/2023/day08/testinput2 b/2023/day08/testinput2 index 5b3fa58..2075af9 100644 --- a/2023/day08/testinput2 +++ b/2023/day08/testinput2 @@ -8,3 +8,4 @@ LR 22C = (22Z, 22Z) 22Z = (22B, 22B) XXX = (XXX, XXX) +AAA = (ZZZ, ZZZ)