37 lines
1.5 KiB
Common Lisp
37 lines
1.5 KiB
Common Lisp
(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)
|