diff --git a/aoc2024/Day21.newt b/aoc2024/Day21.newt index 632205e..682bd94 100644 --- a/aoc2024/Day21.newt +++ b/aoc2024/Day21.newt @@ -75,10 +75,10 @@ seqCost cur (pt :: pts) (kp, cost) = -- cost of best path from -> to in kp pathCost from to kp = - case lookupMap (from, to) (costs kp) of + case lookupMap (from, to) kp.costs of Just (_, cost) => (kp, cost) Nothing => - let (path :: paths) = getPaths (interdit kp) from to | _ => ? in + let (path :: paths) = getPaths kp.interdit from to | _ => ? in case kp of (KP n s i c Nothing) => (kp, 1) (KP n s i c (Just kp')) => @@ -92,7 +92,7 @@ pathCost from to kp = mincost : List Dir → List (List Dir) → Keypad → Keypad × Int mincost path paths kp = - let (kp', cost) = seqCost (0,2) (xlate path $ start kp) (kp, 0) in + let (kp', cost) = seqCost (0,2) (xlate path kp.start) (kp, 0) in case paths of Nil => (kp', cost) (path :: paths) => let (kp', cost') = mincost path paths kp' in (kp', min cost cost') diff --git a/aoc2024/Day21monad.newt b/aoc2024/Day21monad.newt index bc869ba..aa7f7ab 100644 --- a/aoc2024/Day21monad.newt +++ b/aoc2024/Day21monad.newt @@ -81,7 +81,7 @@ getPaths interdit pt@(a,b) to@(c,d) = updateCost : Point × Point → Int → State Keypad Unit updateCost path cost = do kp <- get - put (KP (name kp) (start kp) (interdit kp) (updateMap path cost (costs kp)) (next kp)) + put (KP (.name kp) (.start kp) (.interdit kp) (updateMap path cost (.costs kp)) (.next kp)) keyPos : Dir → Point keyPos North = (0,1) @@ -103,10 +103,10 @@ seqCost cur (pt :: pts) cost = do -- cost of best path from -> to in kp pathCost from to = do kp <- get {Keypad} - case lookupMap (from, to) (costs kp) of + case lookupMap (from, to) (.costs kp) of Just (_, cost) => pure {State Keypad} cost Nothing => - let (path :: paths) = getPaths (interdit kp) from to | _ => ? in + let (path :: paths) = getPaths (.interdit kp) from to | _ => ? in case kp of (KP n s i c Nothing) => pure 1 (KP n s i c (Just kp')) => do @@ -125,7 +125,7 @@ pathCost from to = do mincost : List Dir → List (List Dir) → State Keypad Int mincost path paths = do kp <- get - cost <- seqCost (0,2) (xlate path $ start kp) 0 + cost <- seqCost (0,2) (xlate path $ kp.start) 0 case paths of Nil => pure cost (path :: paths) => do @@ -163,13 +163,13 @@ run fn = do let rob1 = KP "r1" (0,2) (0,0) EmptyMap Nothing let robn = makeKeypad 2 rob1 let kp = KP "kp" (3,2) (3,0) EmptyMap (Just robn) - let p1 = foldl _+_ 0 $ map (uncurry _*_) $ snd $ runState (traverse (runOne numpad) codes) kp + let p1 = foldl _+_ 0 $ map (uncurry _*_) $ snd $ .runState (traverse (runOne numpad) codes) kp putStrLn $ "part1 " ++ show p1 let rob1 = KP "r1" (0,2) (0,0) EmptyMap Nothing let robn = makeKeypad 25 rob1 let kp = KP "kp" (3,2) (3,0) EmptyMap (Just robn) - let p2 = foldl _+_ 0 $ map (uncurry _*_) $ snd $ runState (traverse (runOne numpad) codes) kp + let p2 = foldl _+_ 0 $ map (uncurry _*_) $ snd $ .runState (traverse (runOne numpad) codes) kp putStrLn $ "part2 " ++ show p2 main : IO Unit diff --git a/aoc2024/Day24.newt b/aoc2024/Day24.newt index 292d805..28d7d2b 100644 --- a/aoc2024/Day24.newt +++ b/aoc2024/Day24.newt @@ -24,6 +24,18 @@ record Gate where op : Op out : String +in1 : Gate → String +in1 g = g.in1 + +in2 : Gate → String +in2 g = g.in2 + +out : Gate → String +out g = g.out + +op : Gate → Op +op g = g.op + Wire : U Wire = String × Int