commit - 0208257989a583a9dee119a5269316a42eb39b71
commit + 4af8595fb520002054c5e07b0661b6135c69420b
blob - 975f5f85ccebdfe07e0127c43fd49d2d4e1fa93f
blob + 9f0a8cff3c62f7a8d93f2213b9baa570b239843e
--- src/day-8.lisp
+++ src/day-8.lisp
do (setf (gethash key map) left-right)
finally (return map)))
+(defun walk-to-destination (instructions map starting-point test-fun)
+ (loop with current = starting-point
+ for steps from 0
+ for direction = (aref instructions (mod steps (length instructions)))
+ for (left right) = (gethash current map)
+ do (setf current
+ (ecase direction
+ (#\L left)
+ (#\R right)))
+ when (funcall test-fun current)
+ do (return (1+ steps))))
+
+(defun destination-p (field)
+ (char= (last-elt field) #\Z))
+
(defun day-8 (input)
(let ((instructions (read-line input))
(map (read-map input)))
- (loop with current = "AAA"
- for steps from 0
- for direction = (aref instructions (mod steps (length instructions)))
- for (left right) = (gethash current map)
- do (setf current
- (ecase direction
- (#\L left)
- (#\R right)))
- when (equal current "ZZZ")
- do (return (1+ steps)))))
+ (values (if (gethash "AAA" map)
+ (walk-to-destination instructions map "AAA" (curry #'equal "ZZZ"))
+ 0)
+ (apply #'lcm
+ (loop for field string being the hash-key of map
+ when (char= (last-elt field) #\A)
+ collect (walk-to-destination instructions map field #'destination-p))))))
blob - 6525fd470b0a7ac48ebaf4524046fc026916d302
blob + c148247ceec030b4af7522e7d61056d012794527
--- t/day-8.lisp
+++ t/day-8.lisp
AAA = (BBB, BBB)
BBB = (AAA, ZZZ)
ZZZ = (ZZZ, ZZZ)")
- (assert= 6 task-1)))
+ (assert= 6 task-1))
+
+ (multiple-value-bind (task-1 task-2)
+ (aoc:run-day 8 "LR
+
+11A = (11B, XXX)
+11B = (XXX, 11Z)
+11Z = (11B, XXX)
+22A = (22B, XXX)
+22B = (22C, 22C)
+22C = (22Z, 22Z)
+22Z = (22B, 22B)
+XXX = (XXX, XXX)")
+ (declare (ignore task-1))
+ (assert= 6 task-2)))