aboutsummaryrefslogtreecommitdiff
path: root/2022/Day08/part-one.cl
diff options
context:
space:
mode:
Diffstat (limited to '2022/Day08/part-one.cl')
-rw-r--r--2022/Day08/part-one.cl46
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))))