day08: interactify

This commit is contained in:
Gattix 2023-12-09 20:45:02 +01:00
parent b8a31b37a6
commit c6e23b9dac
2 changed files with 13 additions and 9 deletions

View File

@ -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

View File

@ -8,3 +8,4 @@ LR
22C = (22Z, 22Z)
22Z = (22B, 22B)
XXX = (XXX, XXX)
AAA = (ZZZ, ZZZ)