day 18, part 2, not complete, before going ugly
This commit is contained in:
parent
643bba2464
commit
831f09c9cd
|
@ -105,3 +105,58 @@
|
||||||
|
|
||||||
(defparameter *day-18-input-connectivity*
|
(defparameter *day-18-input-connectivity*
|
||||||
(make-array (find-maxes *day-18-input-coords*) :initial-element 0))
|
(make-array (find-maxes *day-18-input-coords*) :initial-element 0))
|
||||||
|
(fill-connectivity-array *day-18-input-coords* *day-18-input-connectivity*)
|
||||||
|
|
||||||
|
(count-open-sides *day-18-input-connectivity*)
|
||||||
|
|
||||||
|
;; now. how could i only include surface area
|
||||||
|
;; did i need to model points as what?
|
||||||
|
;;
|
||||||
|
;; well, i could start with 0th layer. there's no stone there, only air
|
||||||
|
;; and start filling with 2
|
||||||
|
;; then count for all points as previously, but only neighbors which are 2
|
||||||
|
;; i guess
|
||||||
|
|
||||||
|
;; so. start at '(0 0 0)
|
||||||
|
;; then get neighbors, filter those that are 0
|
||||||
|
;; put into queue / list - actually dfs is good enough, so just recurse?
|
||||||
|
|
||||||
|
(point-at-is '(0 0 0) *day-18-test-graph-connectivity* 0)
|
||||||
|
(point-at-is '(0 0 0) *day-18-test-graph-connectivity* 2)
|
||||||
|
|
||||||
|
(fill-outside-with-2 '(0 0 0) *day-18-test-graph-connectivity*)
|
||||||
|
;; this seems to work.
|
||||||
|
;; now i want to cound only outside that contacts 2?
|
||||||
|
;; so, same cound but look for neighbors 2 and count them, not 6 - stone-neighbors
|
||||||
|
|
||||||
|
(count-open-sides-to-outside *day-18-test-graph-connectivity*)
|
||||||
|
;; well, now i need to add 1 to all sides
|
||||||
|
|
||||||
|
(setq *day-18-test-input*
|
||||||
|
(coords-from-input "day18-test.txt"))
|
||||||
|
|
||||||
|
(setq *day-18-test-graph-connectivity*
|
||||||
|
(make-array (find-maxes *day-18-test-input*) :initial-element 0))
|
||||||
|
(fill-connectivity-array *day-18-test-input* *day-18-test-graph-connectivity*)
|
||||||
|
|
||||||
|
(fill-outside-with-2 '(0 0 0) *day-18-test-graph-connectivity*)
|
||||||
|
(count-open-sides-to-outside *day-18-test-graph-connectivity*)
|
||||||
|
;; and now it's 58
|
||||||
|
;; so, let's cound for full input?
|
||||||
|
|
||||||
|
;;; part 2
|
||||||
|
|
||||||
|
(setq *day-18-input-coords*
|
||||||
|
(coords-from-input "day18-input.txt"))
|
||||||
|
|
||||||
|
(setq *day-18-input-connectivity*
|
||||||
|
(make-array (find-maxes *day-18-input-coords*) :initial-element 0))
|
||||||
|
(fill-connectivity-array *day-18-input-coords* *day-18-input-connectivity*)
|
||||||
|
|
||||||
|
(fill-outside-with-2 '(0 0 0) *day-18-input-connectivity*)
|
||||||
|
(count-open-sides-to-outside *day-18-input-connectivity*)
|
||||||
|
;; there's 1 at the edge of the array. whoops. so there are 0s in the input?
|
||||||
|
;; yep. so now what, shift all by 1? and add one more +1 to the find max?
|
||||||
|
;; hahaha, this is stupid.
|
||||||
|
|
||||||
|
;; but let's do it
|
||||||
|
|
33
day18.lisp
33
day18.lisp
|
@ -11,9 +11,9 @@
|
||||||
(defun find-maxes (all-coords)
|
(defun find-maxes (all-coords)
|
||||||
(loop
|
(loop
|
||||||
for (x y z) in all-coords
|
for (x y z) in all-coords
|
||||||
maximize (1+ x) into xs
|
maximize (+ x 2) into xs
|
||||||
maximize (1+ y) into ys
|
maximize (+ y 2) into ys
|
||||||
maximize (1+ z) into zs
|
maximize (+ z 2) into zs
|
||||||
finally (return (list xs ys zs))) )
|
finally (return (list xs ys zs))) )
|
||||||
|
|
||||||
(defun fill-connectivity-array (all-coords connectivity-matrix)
|
(defun fill-connectivity-array (all-coords connectivity-matrix)
|
||||||
|
@ -21,7 +21,8 @@
|
||||||
for (x y z) in all-coords
|
for (x y z) in all-coords
|
||||||
do (setf (aref connectivity-matrix x y z) 1)))
|
do (setf (aref connectivity-matrix x y z) 1)))
|
||||||
|
|
||||||
(defun neighbors-for (coords connectivity-matrix)
|
;; 1 - rock, 0 - initial empty, 2 - outside air
|
||||||
|
(defun neighbors-for (coords connectivity-matrix &key (type 1))
|
||||||
(labels ((coords-fit (potential-point)
|
(labels ((coords-fit (potential-point)
|
||||||
(loop for i from 0 to 2
|
(loop for i from 0 to 2
|
||||||
always (and (< (nth i potential-point)
|
always (and (< (nth i potential-point)
|
||||||
|
@ -34,7 +35,7 @@
|
||||||
for neighbor = (mapcar #'+ coords deltas)
|
for neighbor = (mapcar #'+ coords deltas)
|
||||||
when
|
when
|
||||||
(and (coords-fit neighbor)
|
(and (coords-fit neighbor)
|
||||||
(= 1 (apply #'aref connectivity-matrix neighbor)))
|
(= type (apply #'aref connectivity-matrix neighbor)))
|
||||||
collect neighbor)))
|
collect neighbor)))
|
||||||
|
|
||||||
(defun count-open-sides (connectivity-matrix)
|
(defun count-open-sides (connectivity-matrix)
|
||||||
|
@ -46,3 +47,25 @@
|
||||||
when (= 1 (aref connectivity-matrix x y z))
|
when (= 1 (aref connectivity-matrix x y z))
|
||||||
summing (- 6
|
summing (- 6
|
||||||
(length (neighbors-for (list x y z) connectivity-matrix))))))))
|
(length (neighbors-for (list x y z) connectivity-matrix))))))))
|
||||||
|
|
||||||
|
(defun point-at-is (coords connectivity-matrix elem)
|
||||||
|
(= elem (apply #'aref connectivity-matrix coords)))
|
||||||
|
|
||||||
|
;; call with initial coord '(0 0 0)
|
||||||
|
(defun fill-outside-with-2 (coord connectivity-matrix)
|
||||||
|
(when (point-at-is coord connectivity-matrix 0)
|
||||||
|
(setf (apply #'aref connectivity-matrix coord) 2)
|
||||||
|
(mapcar (lambda (neighbor) (fill-outside-with-2 neighbor connectivity-matrix))
|
||||||
|
(neighbors-for coord connectivity-matrix :type 0))))
|
||||||
|
|
||||||
|
(defun count-open-sides-to-outside (connectivity-matrix)
|
||||||
|
(destructuring-bind (n m k)
|
||||||
|
(array-dimensions connectivity-matrix)
|
||||||
|
(loop for x from 0 below n sum
|
||||||
|
(loop for y from 0 below m sum
|
||||||
|
(loop for z from 0 below k
|
||||||
|
when (= 1 (aref connectivity-matrix x y z))
|
||||||
|
summing (length (neighbors-for
|
||||||
|
(list x y z)
|
||||||
|
connectivity-matrix
|
||||||
|
:type 2)))))))
|
||||||
|
|
Loading…
Reference in New Issue