(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)