diff options
Diffstat (limited to '2022/Day08/part-one.cl')
| -rw-r--r-- | 2022/Day08/part-one.cl | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/2022/Day08/part-one.cl b/2022/Day08/part-one.cl new file mode 100644 index 0000000..7fd1217 --- /dev/null +++ b/2022/Day08/part-one.cl @@ -0,0 +1,46 @@ + +;;; https://gitlab.com/Syndamia/senzill +(require :senzill) +(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 0)) ; Each tree is a (cons) pair of (<TREE_HEIGHT> . <IS_VISIBLE>) + (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) + (setf (cdr (first row)) 1) ; Edge, we always see it + (loop for col on row + maximize (car (first col)) into max-height + while (cdr col) + if (< max-height (car (second col))) + do + (setf (cdr (second col)) 1))) + + ;;; 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 + sum (loop for tree in row + count (= 1 (cdr tree))) into result + finally (print result)))) |
