diff options
Diffstat (limited to '2022/Day08/part-two.cl')
| -rw-r--r-- | 2022/Day08/part-two.cl | 51 |
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)))) |
