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])) ]; }; }