aboutsummaryrefslogtreecommitdiffstats
path: root/AoC2022/08/solver.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'AoC2022/08/solver.lisp')
-rw-r--r--AoC2022/08/solver.lisp29
1 files changed, 11 insertions, 18 deletions
diff --git a/AoC2022/08/solver.lisp b/AoC2022/08/solver.lisp
index 3cab1c0..32d9977 100644
--- a/AoC2022/08/solver.lisp
+++ b/AoC2022/08/solver.lisp
@@ -6,26 +6,18 @@
(< -1 y height))
(+ x (* y width)))))
-(defun coord-y-minor (width height)
- (let ((xminor (coord-x-minor width height)))
- (lambda (y x)
- (funcall xminor x y))))
-
-(defun flatten-data (data)
- (apply #'vector
- (mapcan (lambda (row)
- (map 'list (lambda (x) (- (char-code x) 48)) row)) data)))
-
(defun forest (data)
(let ((width (length (car data)))
(height (length data)))
- (values (flatten-data data) width height)))
+ (values width height
+ (map 'vector
+ (lambda (x) (- (char-code x) 48))
+ (apply #'concatenate 'string data)))))
(defun solver-p1 (filename)
- (multiple-value-bind (forest-arr width height) (forest (uiop:read-file-lines filename))
+ (multiple-value-bind (width height forest-arr) (forest (uiop:read-file-lines filename))
(let ((visibility-mask (make-array (* width height) :initial-element nil))
- (location-x (coord-x-minor width height))
- (location-y (coord-y-minor width height)))
+ (location-x (coord-x-minor width height)))
(flet ((toggle-visibility (major minor location reverse)
(let ((range (if reverse
(loop for i downfrom (1- minor) to 0 collect i)
@@ -36,15 +28,16 @@
for maxh = -1 then (max maxh tree-height)
for tree-height = (aref forest-arr (funcall location n m))
when (> tree-height maxh)
- do (setf (aref visibility-mask (funcall location n m)) t))))))
+ do (setf (aref visibility-mask (funcall location n m)) t)))))
+ (location-y (y x) (funcall location-x x y)))
(toggle-visibility height width location-x nil)
(toggle-visibility height width location-x t)
- (toggle-visibility width height location-y nil)
- (toggle-visibility width height location-y t))
+ (toggle-visibility width height #'location-y nil)
+ (toggle-visibility width height #'location-y t))
(loop for v across visibility-mask counting v))))
(defun solver-p2 (filename)
- (multiple-value-bind (forest-arr width height) (forest (uiop:read-file-lines filename))
+ (multiple-value-bind (width height forest-arr) (forest (uiop:read-file-lines filename))
(let ((score (make-array (* width height)))
(location-x (coord-x-minor width height)))