aboutsummaryrefslogtreecommitdiffstats
path: root/AoC2022/16
diff options
context:
space:
mode:
Diffstat (limited to 'AoC2022/16')
-rw-r--r--AoC2022/16/solver.lisp22
1 files changed, 13 insertions, 9 deletions
diff --git a/AoC2022/16/solver.lisp b/AoC2022/16/solver.lisp
index 0366fc3..9bda6f2 100644
--- a/AoC2022/16/solver.lisp
+++ b/AoC2022/16/solver.lisp
@@ -31,12 +31,16 @@
(gethash to paths)))
(defun worthwhile-graph (graph)
- (let ((interesting (remove-if #'zerop graph :key #'cadr)))
+ (let ((interesting (remove-if #'zerop graph :key #'cadr))
+ (htgraph (make-hash-table :test #'eq :size 16)))
(loop for (from flow) in (cons '(aa 0) interesting)
- collect (nconc (list from flow)
+ do
+ (setf (gethash from htgraph)
+ (cons flow
(loop for (to) in interesting
when (not (eq from to))
- collect (cons to (1- (length (shortest-path graph from to)))))))))
+ collect (cons to (1- (length (shortest-path graph from to))))))))
+ htgraph))
(defun travel-time (path graph)
(loop for (from to) on path
@@ -51,7 +55,7 @@
(destructuring-bind (next-node-name . time-there) next
(and (not (member next-node-name open :test #'eq))
(< (1+ time-there) time-left)))))
- (remove-if-not #'appropriate (cddr (assoc current graph :test #'eq)))))
+ (remove-if-not #'appropriate (cdr (gethash current graph)))))
(defun path-release-as (path graph start-time)
(loop for (from to) on path
@@ -65,11 +69,11 @@
(defun path-release (path graph start-time)
(loop for (from to) on path
- for node-from = (assoc from graph :test #'eq) then node-to
- and node-to = (assoc to graph :test #'eq)
+ for node-from = (gethash from graph) then node-to
+ and node-to = (gethash to graph)
while node-to
- for neighbors = (cddr node-from)
- for flow = (cadr node-to)
+ for neighbors = (cdr node-from)
+ for flow = (car node-to)
for distance = (cdr (assoc to neighbors :test #'eq))
sum (1+ distance) into runtime
sum (* flow (- start-time runtime)) into release
@@ -96,7 +100,7 @@
(arrows:->
(lambda (next-node)
(destructuring-bind (name . time-there) next-node
- (let ((flow (cadr (assoc name graph :test #'eq)))
+ (let ((flow (car (gethash name graph)))
(time-left (- time-left time-there 1)))
(traverse graph name (cons name open)
time-left