aboutsummaryrefslogtreecommitdiff
path: root/2022/Day08/part-two.cl
diff options
context:
space:
mode:
Diffstat (limited to '2022/Day08/part-two.cl')
-rw-r--r--2022/Day08/part-two.cl51
1 files changed, 51 insertions, 0 deletions
diff --git a/2022/Day08/part-two.cl b/2022/Day08/part-two.cl
new file mode 100644
index 0000000..f20ffe5
--- /dev/null
+++ b/2022/Day08/part-two.cl
@@ -0,0 +1,51 @@
+
+;;; https://gitlab.com/Syndamia/senzill
+(require :senzill)
+(use-package :senzill.math)
+(use-package :senzill.collections)
+(use-package :senzill.io)
+
+(ask-for-stream (prog-input)
+ (let ((forest '()))
+ (doread-lines (inpt :read-line-options (prog-input NIL))
+ (push-back (map 'list
+ (lambda (x) (cons x 1)) ; Each tree is a (cons) pair of (<TREE_HEIGHT> . <SCENIC_SCORE>)
+ (integer-to-list (parse-integer inpt)
+ :min-length (length (first forest)))) ; Doesn't handle if very first digit(s) is zero
+ forest))
+
+ (defun loop-on-row (row)
+ (loop for col on row
+ maximize (car (first col)) into max-height
+ while (cdr col)
+ do
+ (*= (cdr (first col))
+ ;;; Counts seen trees on the right of the current tree
+ (loop for seen on (cdr col)
+ count T into result
+ while (and col (> (car (first col)) (car (first seen))))
+ finally (return result)))
+ finally (setf (cdr (first col)) 0))) ; Last tree doesn't see any trees
+
+ ;;; Checks every row
+ (loop for row in forest
+ do
+ ;; Iterate from left to right
+ (loop-on-row row)
+ ;; Iterate from right to left
+ (loop-on-row (reverse row)))
+
+ ;;; Checks every column
+ (loop for i from 0 to (- (length (first forest)) 1)
+ for col = (loop for row in forest
+ collect (nth i row))
+ do
+ ;; Iterate top to bottom
+ (loop-on-row col)
+ ;; Iterate bottom to top
+ (loop-on-row (reverse col)))
+
+ (loop for row in forest
+ maximize (loop for tree in row
+ maximize (cdr tree)) into result
+ finally (print result))))