diff options
Diffstat (limited to 'AoC2022')
-rw-r--r-- | AoC2022/15/solver.lisp | 26 |
1 files changed, 9 insertions, 17 deletions
diff --git a/AoC2022/15/solver.lisp b/AoC2022/15/solver.lisp index 9a93e1f..3471b3b 100644 --- a/AoC2022/15/solver.lisp +++ b/AoC2022/15/solver.lisp @@ -85,25 +85,17 @@ (let ((bounds (bounds markers)) (max-distance (loop for (sensor beacon) on markers by #'cddr maximize (manhattan-dist sensor beacon)))) - (destructuring-bind ((xmin xmax) ys) bounds (declare (ignore ys)) - (let* ((stride (- (+ (* 2 max-distance) xmax 1) xmin)) - (row-min (- xmin max-distance)) - (row (make-array stride :element-type '(unsigned-byte 1) :initial-element 0))) - (loop for (sensor beacon) on markers by #'cddr - for distance = (manhattan-dist sensor beacon) - when (= target-row (cdr sensor)) - do (setf (aref row (- (car sensor) row-min)) 1) - when (= target-row (cdr beacon)) - do (setf (aref row (- (car beacon) row-min)) 1) - - sum (loop - for x from (- xmin distance) to (+ xmax distance) - when (and (<= (manhattan-dist sensor (cons x target-row)) distance) - (< -1 (- x row-min) stride) - (= 0 (aref row (- x row-min)))) - count it and do (setf (aref row (- x row-min)) 1))))))) + (loop with y = target-row + for x from (- xmin max-distance) to (+ xmax max-distance) + :count (loop for (sensor beacon) on markers by #'cddr + :thereis (and (not (equal beacon (cons x y))) + (not (equal sensor (cons x y))) + (<= (manhattan-dist sensor (cons x y)) + (manhattan-dist sensor beacon)))))))) + + (count-cover (markers (uiop:read-file-lines "eg-in")) 10) (count-cover (markers (uiop:read-file-lines "input")) 2000000) |