commit 9320fac455489ef7263b15f3a6336c7ed34a7934 from: Lukas Henkel date: Wed Dec 11 05:58:49 2024 UTC Day 11 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)))