Compare commits
3 Commits
c2ea2ec16e
...
a1fd83502d
Author | SHA1 | Date |
---|---|---|
|
a1fd83502d | |
|
914abe5a1f | |
|
293250c20b |
|
@ -0,0 +1,2 @@
|
||||||
|
Valve AA has flow rate=0; tunnels lead to valves BB
|
||||||
|
Valve BB has flow rate=1; tunnels lead to valves AA
|
|
@ -0,0 +1,51 @@
|
||||||
|
Valve NV has flow rate=5; tunnels lead to valves ZV, CG, YB, HX, OY
|
||||||
|
Valve NU has flow rate=6; tunnels lead to valves DA, MA, OA, DK
|
||||||
|
Valve VU has flow rate=0; tunnels lead to valves PS, FX
|
||||||
|
Valve JW has flow rate=0; tunnels lead to valves AA, MD
|
||||||
|
Valve RI has flow rate=0; tunnels lead to valves OY, DG
|
||||||
|
Valve DG has flow rate=9; tunnels lead to valves TG, RI, DF, EV, KW
|
||||||
|
Valve PH has flow rate=7; tunnels lead to valves KW, OW, LT, LZ
|
||||||
|
Valve KZ has flow rate=12; tunnels lead to valves ET, QV, CK, MS
|
||||||
|
Valve IX has flow rate=0; tunnels lead to valves TS, DO
|
||||||
|
Valve MS has flow rate=0; tunnels lead to valves LZ, KZ
|
||||||
|
Valve IL has flow rate=0; tunnels lead to valves DO, ET
|
||||||
|
Valve EJ has flow rate=20; tunnels lead to valves AV, JY
|
||||||
|
Valve DK has flow rate=0; tunnels lead to valves NU, CG
|
||||||
|
Valve YB has flow rate=0; tunnels lead to valves NV, PS
|
||||||
|
Valve OA has flow rate=0; tunnels lead to valves YA, NU
|
||||||
|
Valve DA has flow rate=0; tunnels lead to valves NU, RG
|
||||||
|
Valve KO has flow rate=0; tunnels lead to valves AA, TG
|
||||||
|
Valve RG has flow rate=4; tunnels lead to valves DF, DA, ZV, MD, LB
|
||||||
|
Valve MA has flow rate=0; tunnels lead to valves AA, NU
|
||||||
|
Valve OW has flow rate=0; tunnels lead to valves DO, PH
|
||||||
|
Valve KW has flow rate=0; tunnels lead to valves DG, PH
|
||||||
|
Valve DO has flow rate=14; tunnels lead to valves IX, IL, CZ, OW
|
||||||
|
Valve DF has flow rate=0; tunnels lead to valves RG, DG
|
||||||
|
Valve TG has flow rate=0; tunnels lead to valves DG, KO
|
||||||
|
Valve LB has flow rate=0; tunnels lead to valves RG, FX
|
||||||
|
Valve HX has flow rate=0; tunnels lead to valves AA, NV
|
||||||
|
Valve GB has flow rate=0; tunnels lead to valves AV, XK
|
||||||
|
Valve CG has flow rate=0; tunnels lead to valves DK, NV
|
||||||
|
Valve LT has flow rate=0; tunnels lead to valves AO, PH
|
||||||
|
Valve FX has flow rate=23; tunnels lead to valves LB, HY, VU
|
||||||
|
Valve ET has flow rate=0; tunnels lead to valves IL, KZ
|
||||||
|
Valve CK has flow rate=0; tunnels lead to valves UX, KZ
|
||||||
|
Valve LZ has flow rate=0; tunnels lead to valves PH, MS
|
||||||
|
Valve YA has flow rate=17; tunnels lead to valves JY, OA
|
||||||
|
Valve TS has flow rate=0; tunnels lead to valves NO, IX
|
||||||
|
Valve NO has flow rate=8; tunnel leads to valve TS
|
||||||
|
Valve XK has flow rate=24; tunnel leads to valve GB
|
||||||
|
Valve PS has flow rate=18; tunnels lead to valves EV, VU, YB
|
||||||
|
Valve AA has flow rate=0; tunnels lead to valves JW, HX, MA, KO
|
||||||
|
Valve MD has flow rate=0; tunnels lead to valves JW, RG
|
||||||
|
Valve JM has flow rate=19; tunnels lead to valves QV, HY, AO
|
||||||
|
Valve AV has flow rate=0; tunnels lead to valves EJ, GB
|
||||||
|
Valve AO has flow rate=0; tunnels lead to valves JM, LT
|
||||||
|
Valve JY has flow rate=0; tunnels lead to valves YA, EJ
|
||||||
|
Valve OY has flow rate=0; tunnels lead to valves NV, RI
|
||||||
|
Valve UX has flow rate=13; tunnels lead to valves CZ, CK
|
||||||
|
Valve HY has flow rate=0; tunnels lead to valves JM, FX
|
||||||
|
Valve EV has flow rate=0; tunnels lead to valves PS, DG
|
||||||
|
Valve CZ has flow rate=0; tunnels lead to valves UX, DO
|
||||||
|
Valve ZV has flow rate=0; tunnels lead to valves NV, RG
|
||||||
|
Valve QV has flow rate=0; tunnels lead to valves JM, KZ
|
|
@ -0,0 +1,128 @@
|
||||||
|
;; https://adventofcode.com/2022/day/16
|
||||||
|
|
||||||
|
;; so. only idea i had is to build the graph, and then do random walk? ugh.
|
||||||
|
;; we could maybe potentially divide by 2 amount of recursion,
|
||||||
|
;;
|
||||||
|
;; since possible actions are
|
||||||
|
;; - go to next room
|
||||||
|
;; - open current valve & go to next room
|
||||||
|
;;
|
||||||
|
;; and that shared part is almost similar, but is 1 move shorter, but adds some turns of this valve being open
|
||||||
|
;; if i return info on which valves were open for how many turns from the recursion,
|
||||||
|
;; i could potentially calculate what is more - 1 less turn of all of these and + some amount of current room's valve
|
||||||
|
;; or just go to next turn.
|
||||||
|
;;
|
||||||
|
;; but this is kind of way too much, to wander aimlessly?
|
||||||
|
;; maybe I need to build closure, then could choose any desired vertice? and select only those which are not visited.
|
||||||
|
;; this seems much more sane
|
||||||
|
;;
|
||||||
|
;; maybe there's already good \ easy \ powerful graph library?
|
||||||
|
;;
|
||||||
|
;; i found two libraries for graphs.
|
||||||
|
;; https://cl-graph.common-lisp.dev/user-guide.html - this one seem to allow for calculating closures, and filtering.
|
||||||
|
;; (repo: https://github.com/gwkkwg/cl-graph )
|
||||||
|
;; so i could potentially filter the remaining graph for the walkthrough
|
||||||
|
;; https://github.com/kraison/graph-utils - this one visualization and primitives that could allow for writing algos
|
||||||
|
;;
|
||||||
|
;; i guess i'll try to install first. is it available in quicklisp?
|
||||||
|
;; (ql:quickload 'cl-graph)
|
||||||
|
|
||||||
|
(push #p"~/quicklisp/local-projects/cl-graph/" asdf:*central-registry*)
|
||||||
|
|
||||||
|
;; (ql:quickload "cl-graph")
|
||||||
|
(ql:quickload '(:cl-graph :moptilities))
|
||||||
|
(defclass my-graph (cl-graph:basic-graph)
|
||||||
|
())
|
||||||
|
(defparameter *test-graph* nil)
|
||||||
|
;; (:documentation "Stub for matrix based graph. Not implemented.")
|
||||||
|
;; OH NO
|
||||||
|
|
||||||
|
;; (cl-graph:add-vertex *test-graph* 6)
|
||||||
|
;; (cl-graph:vertex-count *test-graph*)
|
||||||
|
|
||||||
|
;; (cl-graph:graph->dot *test-graph* t)
|
||||||
|
|
||||||
|
;; (in-package #:cl-graph)
|
||||||
|
(in-package cl-user)
|
||||||
|
|
||||||
|
(make-graph 'basic-graph) ; still doesn' work
|
||||||
|
;; to allow export to DOT
|
||||||
|
;; https://github.com/gwkkwg/cl-graph/issues/12
|
||||||
|
;; (defclass* dot-graph (dot-graph-mixin graph-container)
|
||||||
|
;; ()
|
||||||
|
;; (:export-p t))
|
||||||
|
(let ((g (make-container 'dot-graph :default-edge-type :directed)))
|
||||||
|
(loop for (a b) in '((a b) (b c) (b d) (d e) (e f) (d f)) do
|
||||||
|
(add-edge-between-vertexes g a b))
|
||||||
|
(graph->dot g nil))
|
||||||
|
|
||||||
|
|
||||||
|
(setq *test-graph*
|
||||||
|
(let ((g (cl-graph:make-graph 'cl-graph:dot-graph)))
|
||||||
|
(loop for v in '(a b c d e) do
|
||||||
|
(cl-graph:add-vertex g v))
|
||||||
|
(loop for (v1 . v2) in '((a . b) (a . c) (b . d) (c . e)) do
|
||||||
|
(cl-graph:add-edge-between-vertexes g v1 v2))
|
||||||
|
g))
|
||||||
|
|
||||||
|
(setq *test-graph*
|
||||||
|
(let ((g (make-graph 'graph-container)))
|
||||||
|
(loop for v in '(a b c d e) do
|
||||||
|
(add-vertex g v))
|
||||||
|
(loop for (v1 . v2) in '((a . b) (a . c) (b . d) (c . e)) do
|
||||||
|
(add-edge-between-vertexes g v1 v2))
|
||||||
|
g))
|
||||||
|
|
||||||
|
(cl-graph:vertex-count *test-graph*)
|
||||||
|
(graph->dot *test-graph* nil)
|
||||||
|
(vertexes *test-graph*)
|
||||||
|
(make-graph-from-vertexes (vertexes *test-graph*))
|
||||||
|
|
||||||
|
(identity 1)
|
||||||
|
;; graph-container already subclass of basic-graph.
|
||||||
|
;; then why doesn't this method is dispatched?
|
||||||
|
(make-filtered-graph *test-graph* (lambda (v) t) )
|
||||||
|
|
||||||
|
;; maybe quicklisp doens't have a fresh enough version?
|
||||||
|
;; ok. how do i make quicklisp use cloned code?
|
||||||
|
|
||||||
|
;; well. too bad.
|
||||||
|
(cl-graph:make-graph-from-vertexes (cl-graph:vertexes *test-graph*))
|
||||||
|
(cl-graph:make-filtered-graph *test-graph* (lambda (v) t) )
|
||||||
|
((lambda (v) t) 1)
|
||||||
|
|
||||||
|
(ql:where-is-system :cl-graph)
|
||||||
|
;; => #P"/home/efim/quicklisp/dists/quicklisp/software/cl-graph-20171227-git/"
|
||||||
|
|
||||||
|
(ql:update-client)
|
||||||
|
(ql:update-all-dists)
|
||||||
|
;; Changes from quicklisp 2022-07-08 to quicklisp 2022-11-07:
|
||||||
|
|
||||||
|
(cl-graph:graph->dot *test-graph* nil)
|
||||||
|
|
||||||
|
;; required additional dependency
|
||||||
|
;; (ql:quickload '(:cl-graph :moptilities))
|
||||||
|
;; asdf system connections
|
||||||
|
;; https://github.com/gwkkwg/cl-graph/blob/3cb786797b24883d784b7350e7372e8b1e743508/cl-graph.asd#L84-L89
|
||||||
|
|
||||||
|
(setq *test-graph*
|
||||||
|
(let ((g (cl-graph:make-graph 'cl-graph:dot-graph)))
|
||||||
|
(loop for v in '(a b c d e) do
|
||||||
|
(cl-graph:add-vertex g v))
|
||||||
|
(loop for (v1 . v2) in '((a . b) (a . c) (b . d) (c . e)) do
|
||||||
|
(cl-graph:add-edge-between-vertexes g v1 v2))
|
||||||
|
g))
|
||||||
|
|
||||||
|
(print (cl-graph:graph->dot *test-graph* nil))
|
||||||
|
|
||||||
|
(print (cl-graph:graph->dot
|
||||||
|
(cl-graph:make-filtered-graph *test-graph*
|
||||||
|
(lambda (v) (not (eq v 'a)))
|
||||||
|
:graph-completion-method nil)
|
||||||
|
nil))
|
||||||
|
|
||||||
|
;; well, that was all for nothing?
|
||||||
|
;; or do i still rather use that library?
|
||||||
|
;; because it would allow me to add data to vertices?
|
||||||
|
;;
|
||||||
|
;; and graph-utils allows for getting hashmap of all paths and lengts?
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,5 @@
|
||||||
|
Valve AA has flow rate=0; tunnels lead to valves BB
|
||||||
|
Valve BB has flow rate=1; tunnels lead to valves CC, EE
|
||||||
|
Valve CC has flow rate=1; tunnels lead to valves DD
|
||||||
|
Valve DD has flow rate=1; tunnels lead to valves EE
|
||||||
|
Valve EE has flow rate=1; tunnels lead to valves EE
|
|
@ -0,0 +1,10 @@
|
||||||
|
Valve AA has flow rate=0; tunnels lead to valves DD, II, BB
|
||||||
|
Valve BB has flow rate=13; tunnels lead to valves CC, AA
|
||||||
|
Valve CC has flow rate=2; tunnels lead to valves DD, BB
|
||||||
|
Valve DD has flow rate=20; tunnels lead to valves CC, AA, EE
|
||||||
|
Valve EE has flow rate=3; tunnels lead to valves FF, DD
|
||||||
|
Valve FF has flow rate=0; tunnels lead to valves EE, GG
|
||||||
|
Valve GG has flow rate=0; tunnels lead to valves FF, HH
|
||||||
|
Valve HH has flow rate=22; tunnel leads to valve GG
|
||||||
|
Valve II has flow rate=0; tunnels lead to valves AA, JJ
|
||||||
|
Valve JJ has flow rate=21; tunnel leads to valve II
|
|
@ -0,0 +1,58 @@
|
||||||
|
;; https://github.com/kraison/graph-utils
|
||||||
|
|
||||||
|
(ql:quickload 'graph-utils)
|
||||||
|
(ql:quickload 'alexandria)
|
||||||
|
|
||||||
|
;;; reading in data
|
||||||
|
;; graph and hashmap from node name to flow and state
|
||||||
|
(defclass verticle-data ()
|
||||||
|
((flow :reader flow :initarg :flow)
|
||||||
|
(name :reader name :initarg :name)
|
||||||
|
(is-opened-p :accessor is-opened-p :initform t)))
|
||||||
|
|
||||||
|
(defmethod print-object ((obj verticle-data) stream)
|
||||||
|
(with-slots (name flow is-opened-p) obj
|
||||||
|
(format stream "~a with flow: ~a; is opened? ~a" name flow is-opened-p)))
|
||||||
|
|
||||||
|
(defun parse-integer-or-symbol (str)
|
||||||
|
(let ((maybe-int (parse-integer str :junk-allowed t)))
|
||||||
|
(if maybe-int
|
||||||
|
maybe-int
|
||||||
|
(intern (string-upcase str)))))
|
||||||
|
|
||||||
|
(defun parse-input-line (line)
|
||||||
|
(destructuring-bind (-valve source-name -has -flow -rate flow-rate
|
||||||
|
-tunnels -lead -to -valves &rest to-valve-names)
|
||||||
|
(mapcar #'parse-integer-or-symbol
|
||||||
|
(remove-if (lambda (str) (equal "" str)) (cl-ppcre:split "(,| |=)" line)))
|
||||||
|
(format t "from ~a with ~a; to ~a~%" source-name flow-rate to-valve-names)
|
||||||
|
(list source-name flow-rate to-valve-names)))
|
||||||
|
|
||||||
|
(defun read-file-data (filename graph vertices-data-map)
|
||||||
|
(loop
|
||||||
|
for line-struct in
|
||||||
|
(mapcar #'parse-input-line (uiop:read-file-lines filename))
|
||||||
|
do (put-struct-into-storages line-struct graph vertices-data-map)))
|
||||||
|
|
||||||
|
|
||||||
|
;;; calculations for part 1
|
||||||
|
|
||||||
|
(defun get-possible-next-vs (cur-node graph vertices-data-map shortest-paths time-remaining)
|
||||||
|
(loop
|
||||||
|
for (from . to)
|
||||||
|
being the hash-keys in shortest-paths using (hash-value dist)
|
||||||
|
for from-node = (graph-utils:lookup-node graph from)
|
||||||
|
for to-node = (graph-utils:lookup-node graph to)
|
||||||
|
for to-node-data = (gethash to-node vertices-data-map)
|
||||||
|
when (and (equal cur-node from-node)
|
||||||
|
(not (equal cur-node to-node))
|
||||||
|
(not (= 0 (flow to-node-data)))
|
||||||
|
(> time-remaining dist)
|
||||||
|
(is-opened-p to-node-data))
|
||||||
|
do (format t "from ~a to ~a dist: ~a. ~a~%" from-node to-node dist to-node-data)
|
||||||
|
when (and (equal cur-node from-node)
|
||||||
|
(not (equal cur-node to-node))
|
||||||
|
(not (= 0 (flow to-node-data)))
|
||||||
|
(> time-remaining dist)
|
||||||
|
(is-opened-p to-node-data))
|
||||||
|
collect (list to-node dist)))
|
Loading…
Reference in New Issue