commit - 4d8a994d50d75ba86c7743d03f2975dec4a1a2f3
commit + bdfa5503a3d4ecd13dadd04919901580392ea8ab
blob - 396ec8a2339c5e723e63313fa58e22d6f9be35af
blob + 9e964c2daca395fff8e0d7679e07b92e9d59cf52
--- src/day-16.lisp
+++ src/day-16.lisp
(:up (point+ pos (cons 0 -1)))
(:left (point+ pos (cons -1 0)))))
-(defun shoot-beam (map)
+(defun shoot-beam (map start-pos start-dir)
(loop with energizing-map = (make-hash-table :test 'equal)
with passing-map = (make-hash-table :test 'equal)
- with todo = (list (list (cons 0 0) :right))
+ with todo = (list (list start-pos start-dir))
with width = (input-map-width map)
with height = (input-map-height map)
for (pos direction) = (pop todo)
finally (return (hash-table-count energizing-map))))
(defun day-16 (input)
- (let ((map (make-map input)))
- (shoot-beam map)))
+ (let* ((map (make-map input))
+ (task-1 (shoot-beam map (cons 0 0) :right))
+ (width (input-map-width map))
+ (height (input-map-height map)))
+ (values task-1
+ (max
+ (loop for (row dir) in `((0 :down) (,(1- height) :up))
+ maximize (loop for x from 0 below width
+ maximize (shoot-beam map (cons x row) dir)))
+ (loop for (col dir) in `((0 :right) (,(1- width) :left))
+ maximize (loop for y from 0 below height
+ maximize (shoot-beam map (cons col y) dir)))))))
blob - 351995254ba27a74d3a147bf87eff2c5965295d8
blob + 18a76e3d590c2fb8698c39956830270858bca53f
--- t/day-16.lisp
+++ t/day-16.lisp
(define-test test-day-16
()
- (multiple-value-bind (task-1)
+ (multiple-value-bind (task-1 task-2)
(aoc:run-day 16 ".|...\\....
|.-.\\.....
.....|-...
.-.-/..|..
.|....-|.\\
..//.|....")
- (assert= 46 task-1)))
+ (assert= 46 task-1)
+ (assert= 51 task-2)))