;;; 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 ( . ) (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))))