From 88fa4fed054245b95d5a8a73d4fb94c8365844d7 Mon Sep 17 00:00:00 2001 From: Alan Daniels Date: Mon, 8 Dec 2025 22:02:42 +1100 Subject: [PATCH] day 3 part 2 --- 03b.lisp | 40 ++++++++++++++++++++++++++++++++++++++++ flake.nix | 2 +- 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 03b.lisp diff --git a/03b.lisp b/03b.lisp new file mode 100644 index 0000000..c9cab7b --- /dev/null +++ b/03b.lisp @@ -0,0 +1,40 @@ +(require :uiop) +(load (sb-ext:posix-getenv "ASDF")) +(asdf:load-system 'cl-heap) + +(defun bank-max-joltage-step (known-buffer unknown-buffer depth) + ;; (format t "~A:~A~%" known-buffer unknown-buffer) + (if (= (length known-buffer) depth) + (parse-integer known-buffer) + (loop for i from 0 to (- (length unknown-buffer) (- depth (length known-buffer))) + collect + (let* ( + (digit (subseq unknown-buffer i (+ i 1))) + (new-unknown-buffer (subseq unknown-buffer (+ i 1))) + (new-known-buffer (format nil "~A~A" known-buffer digit))) + (list (- 0 (parse-integer new-known-buffer)) new-known-buffer new-unknown-buffer depth))))) +(bank-max-joltage-step "" "234234234234278" 2) + +(defun bank-max-joltage (bank depth) + (defparameter *queue* (make-instance 'cl-heap:priority-queue)) + (cl-heap:enqueue *queue* (list "" bank depth) 0) + (loop + do (defparameter *candidate* (apply #'bank-max-joltage-step (cl-heap:dequeue *queue*))) + when (integerp *candidate*) + do (return *candidate*) + do (loop for branch in (reverse *candidate*) + do (cl-heap:enqueue *queue* (cdr branch) (car branch))) + ) + ) +(bank-max-joltage "234234234234278" 2) +(bank-max-joltage "234234234234278" 12) + +(defun bank-max-joltage12 (bank) + (bank-max-joltage bank 12) + ) +(defun array-total-joltage (bank-list depth) + (reduce #'+ + (mapcar #'bank-max-joltage12 bank-list))) + +(array-total-joltage (uiop:read-file-lines "03example.txt") 12) +(array-total-joltage (uiop:read-file-lines "03data.txt") 12) diff --git a/flake.nix b/flake.nix index a47cafa..079157b 100644 --- a/flake.nix +++ b/flake.nix @@ -23,7 +23,7 @@ default = pkgs.mkShellNoCC { packages = with pkgs; [ shellcheck - (sbcl.withPackages (ps: [ps.str])) + (sbcl.withPackages (ps: [ps.str ps.cl-heap])) ]; }; }