day08: interactify
This commit is contained in:
parent
b8a31b37a6
commit
c6e23b9dac
@ -7,14 +7,12 @@ import qualified Data.Map as M
|
|||||||
|
|
||||||
type LR a = (a, a) -> a
|
type LR a = (a, a) -> a
|
||||||
|
|
||||||
main :: IO ()
|
type Tunnels = M.Map String (String, String)
|
||||||
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
|
|
||||||
|
|
||||||
parse :: [String] -> ([LR String], M.Map String (String, String))
|
main :: IO ()
|
||||||
|
main = interact $ show . day08 . parse . lines
|
||||||
|
|
||||||
|
parse :: [String] -> ([LR String], Tunnels)
|
||||||
parse =
|
parse =
|
||||||
cycle .
|
cycle .
|
||||||
map
|
map
|
||||||
@ -30,9 +28,14 @@ parseLine s = (a, (b, c))
|
|||||||
where
|
where
|
||||||
[a, b, c] = wordsBy (not . isAlphaNum) s
|
[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 _ _ [_, _, 'Z'] = 0
|
||||||
day08a (lr:lrs) m pos = 1 + day08a lrs m (lr (m M.! pos))
|
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
|
day08b lrs m starts = foldr1 lcm $ map (day08a lrs m) starts
|
||||||
|
@ -8,3 +8,4 @@ LR
|
|||||||
22C = (22Z, 22Z)
|
22C = (22Z, 22Z)
|
||||||
22Z = (22B, 22B)
|
22Z = (22B, 22B)
|
||||||
XXX = (XXX, XXX)
|
XXX = (XXX, XXX)
|
||||||
|
AAA = (ZZZ, ZZZ)
|
||||||
|
Loading…
Reference in New Issue
Block a user