aboutsummaryrefslogtreecommitdiff
path: root/2022/Day08/part-two.cl
diff options
context:
space:
mode:
authorSyndamia <kamen@syndamia.com>2022-12-08 16:08:58 +0200
committerSyndamia <kamen@syndamia.com>2022-12-08 16:08:58 +0200
commit46b53fcf72f28d8a7bbbbd9d347232efa6c4de64 (patch)
tree59e41edd2df80167e62910d1341953c6779ab15c /2022/Day08/part-two.cl
parentf63f48184eda1ea426e702f2288c2e02f7584323 (diff)
downloadadvent-of-code-46b53fcf72f28d8a7bbbbd9d347232efa6c4de64.tar
advent-of-code-46b53fcf72f28d8a7bbbbd9d347232efa6c4de64.tar.gz
advent-of-code-46b53fcf72f28d8a7bbbbd9d347232efa6c4de64.zip
[2022/D08] Solved both tasks from today
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))))