From 3241a9f65f227f8bcbe53409b9138baa238fcace Mon Sep 17 00:00:00 2001 From: Oscar Najera Date: Sat, 17 Dec 2022 13:32:48 +0100 Subject: Day 15 solve part 1 --- AoC2022/15/solver.lisp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'AoC2022') diff --git a/AoC2022/15/solver.lisp b/AoC2022/15/solver.lisp index 0166b23..584141f 100644 --- a/AoC2022/15/solver.lisp +++ b/AoC2022/15/solver.lisp @@ -80,3 +80,28 @@ for l from (* (+ 10 ymin) stride) when (= 3 (aref grid l)) count it)))) + +(let* ((lines (uiop:read-file-lines "input")) + (markers (markers lines)) + (bounds (bounds markers)) + (max-distance (loop for (sensor beacon) on markers by #'cddr + maximize (manhattan-dist sensor beacon)))) + + (destructuring-bind ((xmin xmax) (ymin ymax)) bounds + (let* ((stride (- (+ (* 2 max-distance) xmax 1) xmin)) + (row-min (- xmin max-distance)) + (target-row 2000000) + (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)))))) -- cgit v1.2.3