aboutsummaryrefslogtreecommitdiff
path: root/2022/Day08/part-one.cl
blob: 7fd121718e0271cea56dd982e5d5d717d30a033d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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))))