day 14, part 2 - endless pyramid
This commit is contained in:
parent
c82f5473ba
commit
6757e3ba23
|
@ -350,3 +350,36 @@
|
||||||
(drop-result (drop-sand-unit arena) (drop-sand-unit arena)))
|
(drop-result (drop-sand-unit arena) (drop-sand-unit arena)))
|
||||||
((not drop-result)
|
((not drop-result)
|
||||||
sand-units)))
|
sand-units)))
|
||||||
|
|
||||||
|
;;; PART 2
|
||||||
|
;; let's not do floor infinite.
|
||||||
|
;; let's just give it enough left-to-right?
|
||||||
|
;; since the triangle is 2 right angle triangles, then bottom is 2x height
|
||||||
|
;; so, let's add 4x height of the floor?
|
||||||
|
;;
|
||||||
|
;; new bottommost =
|
||||||
|
(+ 2 bottommost)
|
||||||
|
;; new leftmost =
|
||||||
|
(min leftmost
|
||||||
|
(- 500 (* 2 bottommost)))
|
||||||
|
;; new rightmost =
|
||||||
|
(max rightmost
|
||||||
|
(+ 500 (* 2 bottommost)))
|
||||||
|
|
||||||
|
;; and add new rock-line?
|
||||||
|
;; just through function that adds a rockline
|
||||||
|
|
||||||
|
(slot-value *test-arena* 'grid)
|
||||||
|
|
||||||
|
;; and now i'd like a more compact printing.
|
||||||
|
;; how'd i do that?
|
||||||
|
;; surely there's a way to get access ot a slice of the 2d array?
|
||||||
|
|
||||||
|
(let* ((arena *test-arena*)
|
||||||
|
(array (slot-value arena 'grid)))
|
||||||
|
(dotimes (row (array-dimension array 0))
|
||||||
|
(dotimes (col (array-dimension array 1))
|
||||||
|
(format t "~a" (aref array row col)))
|
||||||
|
(terpri)))
|
||||||
|
|
||||||
|
(drop-sand-unit *test-arena*)
|
||||||
|
|
60
day14.lisp
60
day14.lisp
|
@ -2,6 +2,7 @@
|
||||||
(ql:quickload 'cl-ppcre)
|
(ql:quickload 'cl-ppcre)
|
||||||
(ql:quickload 'alexandria)
|
(ql:quickload 'alexandria)
|
||||||
|
|
||||||
|
;; (defparameter *day14-input-file* "day14-test.txt")
|
||||||
(defparameter *day14-input-file* "day14-input.txt")
|
(defparameter *day14-input-file* "day14-input.txt")
|
||||||
|
|
||||||
(defclass arena ()
|
(defclass arena ()
|
||||||
|
@ -75,7 +76,7 @@
|
||||||
(put-rock-line arena start-x end-x start-y end-y) )))
|
(put-rock-line arena start-x end-x start-y end-y) )))
|
||||||
|
|
||||||
;; reinit things
|
;; reinit things
|
||||||
(init-arena)
|
;; (init-arena)
|
||||||
(defun init-arena ()
|
(defun init-arena ()
|
||||||
|
|
||||||
(setq *test-input-flat-coords*
|
(setq *test-input-flat-coords*
|
||||||
|
@ -124,7 +125,8 @@
|
||||||
(first sand-coords) (second sand-coords) arena)))
|
(first sand-coords) (second sand-coords) arena)))
|
||||||
((or (not sand-coords) ; sand rests
|
((or (not sand-coords) ; sand rests
|
||||||
(out-of-bounds (first sand-coords) (second sand-coords) arena)) ; end condition - rest or out of bounds
|
(out-of-bounds (first sand-coords) (second sand-coords) arena)) ; end condition - rest or out of bounds
|
||||||
(when (not sand-coords)
|
(when (or (not sand-coords)
|
||||||
|
(equal prev-coords '(500 0))) ; if sand rests at entry point
|
||||||
(set-place arena (first prev-coords) (second prev-coords) #\x)))
|
(set-place arena (first prev-coords) (second prev-coords) #\x)))
|
||||||
;; (format t "sc: ~a, prev: ~a~%" sand-coords prev-coords)
|
;; (format t "sc: ~a, prev: ~a~%" sand-coords prev-coords)
|
||||||
))
|
))
|
||||||
|
@ -140,3 +142,57 @@
|
||||||
(drop-sand-unit-abyss *test-arena*) ; 901
|
(drop-sand-unit-abyss *test-arena*) ; 901
|
||||||
|
|
||||||
;;; PART 2
|
;;; PART 2
|
||||||
|
|
||||||
|
(defun init-arena-2 ()
|
||||||
|
|
||||||
|
(setq *test-input-flat-coords*
|
||||||
|
(alexandria:flatten (mapcar #'input-line-to-rock-coords
|
||||||
|
(uiop:read-file-lines *day14-input-file*))))
|
||||||
|
;; building empty arena
|
||||||
|
(setq *test-arena*
|
||||||
|
(let ((flat-coords
|
||||||
|
(alexandria:flatten (mapcar #'input-line-to-rock-coords (uiop:read-file-lines *day14-input-file*)))))
|
||||||
|
(destructuring-bind (leftmost rightmost bottommost)
|
||||||
|
(loop
|
||||||
|
for (x y) on flat-coords
|
||||||
|
by #'cddr
|
||||||
|
minimize x into leftmost
|
||||||
|
maximize x into rightmost
|
||||||
|
maximize y into bottommost
|
||||||
|
finally (return (list leftmost rightmost bottommost)))
|
||||||
|
(let ((new-bottommost (+ 2 bottommost))
|
||||||
|
(new-leftmost (min leftmost
|
||||||
|
(- 500 (* 2 bottommost))))
|
||||||
|
(new-rightmost (max rightmost
|
||||||
|
(+ 500 (* 2 bottommost)))))
|
||||||
|
(make-arena new-leftmost new-rightmost new-bottommost)))))
|
||||||
|
;; and put floor
|
||||||
|
(let ((floor-y (bottommost *test-arena*))
|
||||||
|
(floor-x-start (leftmost *test-arena*))
|
||||||
|
(floor-x-end (rightmost *test-arena*)))
|
||||||
|
(put-rock-line *test-arena* floor-x-start floor-x-end floor-y floor-y))
|
||||||
|
|
||||||
|
(setq *test-input-coords-chains*
|
||||||
|
(mapcar #'input-line-to-rock-coords
|
||||||
|
(uiop:read-file-lines *day14-input-file*)))
|
||||||
|
|
||||||
|
; this is second step of initialization
|
||||||
|
(put-rock-lines *test-arena* *test-input-coords-chains*))
|
||||||
|
|
||||||
|
;; rewriting previous. otherwise endless loop
|
||||||
|
(defun drop-sand-unit (arena)
|
||||||
|
(do*
|
||||||
|
((prev-coords '(500 0) sand-coords)
|
||||||
|
(sand-coords (sand-check-next-move 500 0 arena)
|
||||||
|
(sand-check-next-move
|
||||||
|
(first sand-coords) (second sand-coords) arena)))
|
||||||
|
((or (not sand-coords) ; sand rests
|
||||||
|
(out-of-bounds (first sand-coords) (second sand-coords) arena)) ; end condition - rest or out of bounds
|
||||||
|
(when (and (not sand-coords)
|
||||||
|
(not (equal prev-coords '(500 0)))) ; if sand rests
|
||||||
|
(set-place arena (first prev-coords) (second prev-coords) #\x)))
|
||||||
|
;; (format t "sc: ~a, prev: ~a~%" sand-coords prev-coords)
|
||||||
|
))
|
||||||
|
|
||||||
|
(init-arena-2)
|
||||||
|
(print (1+ (drop-sand-unit-abyss *test-arena*)))
|
||||||
|
|
Loading…
Reference in New Issue