Commit Diff


commit - 7bd93562fa1827db036c3b25cfe787b809b12669
commit + 9320fac455489ef7263b15f3a6336c7ed34a7934
blob - /dev/null
blob + 4a7ac97e085115e08f082d7acd07de9447152294 (mode 644)
--- /dev/null
+++ input/11.txt
@@ -0,0 +1 @@
+337 42493 1891760 351136 2 6932 73 0
blob - /dev/null
blob + debf85dfc2e9a81173bc0962a659883b5da0f908 (mode 644)
--- /dev/null
+++ src/day-11.lisp
@@ -0,0 +1,42 @@
+(defpackage #:aoc/day-11
+  (:use #:cl #:aoc/utils)
+  (:export #:day-11))
+(in-package #:aoc/day-11)
+
+(declaim (inline number-of-digits)
+         (ftype (function (fixnum) fixnum) number-of-digits))
+
+(defun number-of-digits (number)
+  (floor (1+ (log number 10))))
+
+(defun blink (stones target-depth)
+  (let ((memo (make-hash-table :test #'equal)))
+    (labels ((%blink (stone depth)
+               (when (= depth target-depth)
+                 (return-from %blink 1))
+               (let ((num-digits (or (zerop stone)
+                                     (number-of-digits stone)))
+                     (new-depth (1+ depth)))
+                 (cond
+                   ((zerop stone)
+                    (%blink-memo 1 new-depth))
+                   ((evenp num-digits)
+                    (let ((divisor (expt 10 (/ num-digits 2))))
+                      (multiple-value-bind (left right)
+                          (floor stone divisor)
+                        (+ (%blink-memo left new-depth)
+                           (%blink-memo right new-depth)))))
+                   ((oddp num-digits)
+                    (%blink-memo (* stone 2024) new-depth)))))
+             (%blink-memo (stone depth)
+               (let ((key (list stone depth)))
+                 (or (gethash key memo)
+                     (setf (gethash key memo)
+                           (%blink stone depth))))))
+      (loop for stone in stones
+            sum (%blink-memo stone 0)))))
+
+(defun day-11 (input)
+  (let ((stones (read-number-list (read-line input))))
+    (values (blink stones 25)
+            (blink stones 75))))
blob - /dev/null
blob + 602b0b6dae619dc16c6945cd3e6e778388f094cf (mode 644)
--- /dev/null
+++ t/day-11.lisp
@@ -0,0 +1,11 @@
+(defpackage #:aoc-test/day-11
+  (:use #:cl #:lisp-unit2)
+  (:import-from #:aoc/day-11))
+(in-package #:aoc-test/day-11)
+
+(define-test test-day-11
+    ()
+  (multiple-value-bind (task-1 task-2)
+      (aoc:run-day 11 "125 17")
+    (assert= 55312 task-1)
+    (assert= 65601038650482 task-2)))