;;;; aoc-2022-8.lisp (defpackage #:aoc/2022/8 (:use #:cl) (:import-from #:alexandria #:copy-array)) (in-package #:aoc/2022/8) (defparameter +problem-8-input+ (make-array '(99 99) :initial-contents (list (list 0 0 0 1 0 1 0 0 2 1 0 2 0 0 3 1 2 1 3 2 3 2 4 1 1 4 4 2 3 3 3 0 4 2 4 2 0 4 4 4 4 4 2 2 4 3 2 2 5 5 5 1 2 2 2 2 4 1 1 1 4 4 2 4 3 0 0 4 2 0 0 2 4 2 2 4 0 4 0 1 1 0 3 3 2 0 0 1 0 2 3 1 2 0 1 0 2 2 2) (list 2 2 1 0 0 1 2 1 0 3 2 0 1 1 1 2 0 0 0 2 3 3 4 1 0 2 2 2 1 4 2 2 3 1 3 4 0 3 1 4 1 3 1 1 1 4 5 1 5 3 2 4 1 2 3 5 5 5 2 4 5 5 2 4 3 3 0 1 3 1 3 1 4 4 1 4 3 0 4 3 0 2 3 0 0 3 1 1 3 3 0 0 3 0 0 2 2 2 0) (list 1 2 2 2 2 1 2 3 1 0 0 0 3 2 3 3 2 0 2 0 0 2 3 4 4 4 3 1 2 3 4 1 0 2 2 2 4 4 3 5 5 5 1 1 1 5 3 1 2 5 1 2 4 4 2 4 5 5 3 2 5 5 1 5 3 3 1 0 2 3 2 4 2 3 1 1 3 4 2 4 1 4 0 0 3 3 1 2 3 1 1 0 3 3 1 1 2 0 2) (list 0 0 2 1 0 1 0 0 2 2 2 0 3 0 2 2 3 4 3 4 4 3 3 3 0 4 2 4 3 0 1 3 4 1 1 5 5 1 3 3 3 2 1 2 3 4 1 5 1 3 5 4 4 1 4 3 4 5 1 5 5 2 1 4 1 1 5 4 3 3 3 1 1 0 1 3 2 3 0 3 4 1 3 1 0 0 2 2 3 1 3 2 2 0 1 2 2 0 0) (list 0 1 2 1 0 3 2 1 1 1 3 1 2 3 0 3 1 0 2 3 1 1 1 2 1 4 4 2 3 4 3 1 5 5 3 5 4 5 2 4 5 5 5 2 5 2 2 3 2 1 4 1 3 3 1 3 2 2 3 5 2 2 3 5 4 3 1 2 5 5 4 4 1 0 2 1 2 4 1 3 4 0 3 1 2 3 1 1 3 1 2 2 2 2 1 0 1 1 2) (list 1 1 1 1 3 0 0 0 2 1 3 1 0 0 3 0 1 3 4 2 3 0 3 0 3 1 2 1 2 1 1 4 1 4 5 1 1 1 2 3 1 2 2 2 1 5 3 5 3 1 3 2 5 2 4 5 5 4 4 3 3 4 3 3 2 2 5 2 5 3 2 1 2 0 2 0 4 3 4 4 1 2 4 0 0 2 3 2 1 1 1 0 2 3 3 3 1 1 0) (list 0 1 0 1 0 1 1 3 3 2 0 3 2 2 2 4 3 2 2 2 3 1 1 2 1 1 5 3 2 2 5 3 1 4 5 2 1 2 1 2 3 2 1 1 1 5 1 4 4 3 5 2 4 1 3 3 2 4 5 5 3 2 3 1 3 3 1 5 4 3 1 1 2 2 5 1 1 1 1 1 3 1 0 1 0 4 2 1 0 0 1 3 3 2 3 1 2 2 0) (list 2 1 2 3 1 2 1 2 2 2 0 1 4 2 3 3 1 1 0 1 2 3 4 4 4 4 3 4 5 4 3 4 1 2 2 4 4 2 4 2 4 1 4 5 3 2 6 4 3 6 3 5 2 2 2 1 5 5 5 2 4 2 5 4 4 4 1 3 2 4 4 5 3 1 1 4 2 0 0 0 2 4 1 2 2 4 0 1 0 1 2 2 0 2 1 3 3 0 1) (list 1 0 1 0 2 3 3 1 1 3 3 2 3 3 3 3 1 2 3 1 0 0 4 2 3 1 2 5 4 5 1 2 1 5 4 1 3 5 5 2 3 2 5 6 6 3 4 2 4 6 6 6 5 4 6 4 2 4 4 6 6 4 4 1 2 3 2 4 3 3 5 4 4 1 3 1 4 2 1 0 0 0 1 0 4 3 4 4 1 1 3 0 3 1 2 0 1 2 3) (list 1 2 0 1 3 0 0 2 0 3 4 4 4 4 2 2 1 2 3 2 1 4 5 2 4 3 2 1 1 1 2 1 4 3 1 4 2 2 4 4 2 5 4 6 2 5 3 5 5 6 4 4 2 6 3 5 5 5 4 4 6 2 3 2 2 2 2 4 4 5 4 3 3 4 2 2 2 1 4 3 0 3 2 3 2 2 4 3 0 3 4 1 2 1 2 3 1 2 3) (list 1 0 0 1 2 2 2 0 1 4 3 3 4 4 0 3 0 1 0 2 2 4 2 1 2 1 2 1 5 3 3 4 4 3 2 6 3 3 5 2 5 4 3 3 6 3 3 2 3 6 2 5 2 4 4 5 5 2 5 5 5 3 6 2 5 3 4 2 2 1 2 1 5 1 1 2 1 5 5 4 2 1 1 1 4 0 4 4 3 4 3 3 3 2 0 3 1 3 1) (list 0 1 3 3 0 2 0 3 3 0 4 3 4 2 1 0 3 1 4 3 5 3 1 2 2 5 3 1 3 5 3 5 4 2 6 3 2 2 4 2 2 2 4 6 5 5 5 4 5 6 6 3 2 5 3 6 4 5 6 6 4 6 3 6 2 2 3 6 6 2 4 1 1 4 3 4 1 4 1 3 5 1 3 0 4 4 1 3 0 1 2 4 3 2 3 3 1 1 2) (list 3 1 3 0 3 3 3 2 0 0 3 1 4 2 1 0 2 2 4 1 3 3 4 4 3 1 1 5 5 4 2 6 3 4 6 3 3 3 6 5 5 5 3 2 4 6 6 5 3 2 6 4 6 4 4 4 2 6 6 3 5 2 2 5 6 3 4 2 3 2 4 2 3 4 3 5 1 5 2 5 5 1 4 1 0 4 2 4 3 4 1 1 0 3 1 3 3 0 2) (list 2 0 2 1 1 0 3 3 0 2 2 0 0 2 4 3 5 1 3 5 5 5 5 3 5 2 4 3 4 3 3 5 3 2 6 3 4 5 2 5 6 4 6 6 2 4 4 4 6 5 2 2 6 4 6 6 4 6 4 4 2 6 3 2 2 2 4 2 2 3 4 3 3 5 1 4 3 3 3 1 3 2 4 5 2 0 4 1 4 0 0 3 1 0 4 2 2 3 3) (list 2 3 1 2 2 2 1 3 0 0 0 3 1 3 1 5 2 1 4 4 3 5 3 1 5 1 3 2 2 3 2 6 3 2 2 5 5 2 3 6 4 6 5 4 6 2 4 5 7 7 6 4 7 6 5 5 2 2 5 2 4 3 3 5 3 2 3 4 3 4 2 3 2 5 6 2 1 1 4 1 5 5 2 1 1 1 1 3 3 2 2 1 1 4 0 0 2 1 3) (list 1 3 0 3 0 1 4 1 2 3 3 1 2 4 5 4 2 2 2 4 2 1 4 4 4 2 3 2 3 2 4 4 2 6 6 6 3 4 3 5 4 3 7 6 6 5 5 4 5 6 5 3 7 6 6 6 7 5 4 3 6 4 6 3 4 3 2 4 5 2 3 3 3 4 5 4 3 1 1 4 4 4 2 4 3 5 1 2 2 0 2 0 1 1 3 0 3 1 1) (list 1 0 1 0 0 1 3 0 2 0 3 3 4 4 3 3 2 2 3 3 2 1 3 5 4 6 3 5 3 2 4 2 6 2 4 3 5 3 4 7 4 3 7 4 5 5 5 5 7 5 7 3 7 3 4 3 5 5 4 6 5 4 5 6 2 2 6 4 4 2 2 5 3 2 2 6 2 1 1 4 5 4 1 2 5 5 2 2 0 0 0 0 3 0 2 3 2 2 2) (list 3 2 3 1 4 1 1 3 0 0 3 3 5 3 5 3 3 1 3 3 2 2 3 2 6 3 4 2 6 6 2 6 6 2 5 2 4 5 6 7 6 3 7 5 5 7 6 6 7 4 5 5 4 3 6 3 7 3 3 6 5 7 5 7 6 6 6 3 5 6 6 2 5 6 6 2 5 5 1 1 1 5 4 1 5 4 2 1 5 3 1 2 0 4 0 3 4 3 3) (list 3 0 1 3 3 3 1 4 2 3 1 1 1 3 1 4 4 1 2 5 2 3 2 4 4 5 5 5 5 3 5 5 2 5 6 4 6 7 7 6 3 5 5 4 5 7 5 7 5 7 6 6 6 7 4 3 5 7 4 7 4 4 6 3 6 7 5 5 5 2 4 3 3 5 6 2 4 3 5 6 5 2 1 3 4 2 4 2 5 2 0 3 4 4 0 3 4 1 1) (list 1 1 3 3 4 1 0 1 3 3 0 1 3 2 2 4 3 3 4 5 4 2 2 5 5 6 5 4 6 3 6 2 4 3 7 6 6 5 7 5 5 6 7 6 6 4 5 3 4 7 6 6 5 5 6 4 3 3 6 5 4 3 4 7 6 7 3 5 4 4 6 2 2 2 4 3 6 6 6 3 6 4 3 1 1 3 2 2 1 4 2 3 3 3 1 1 3 4 0) (list 2 4 4 1 0 3 0 2 3 1 1 3 4 5 5 4 3 1 1 4 3 2 6 3 3 2 4 4 4 2 5 7 6 6 6 6 4 5 4 7 3 7 7 5 7 4 3 4 5 4 3 6 4 7 7 4 5 4 7 7 7 3 3 6 4 4 6 3 5 4 3 2 5 2 6 5 6 5 2 4 2 2 2 3 2 5 2 2 4 3 2 4 4 0 1 3 3 4 2) (list 0 3 3 4 0 2 2 4 4 2 1 5 5 3 4 2 2 5 4 2 6 6 6 4 2 2 4 4 3 5 6 6 4 5 7 4 3 5 7 7 6 4 6 4 4 6 4 4 5 7 4 6 5 5 6 5 3 4 3 6 4 5 5 4 4 4 3 4 6 4 7 4 4 3 5 4 6 5 6 5 2 4 3 5 2 2 5 5 4 3 1 2 2 1 0 2 0 4 3) (list 1 2 2 4 2 0 4 3 5 1 4 4 2 1 5 4 3 4 3 2 4 2 2 5 6 4 2 3 4 4 4 7 6 4 7 3 6 7 3 7 3 5 7 7 5 5 4 4 6 8 5 7 7 8 4 4 6 5 5 5 5 3 4 7 7 4 7 3 6 7 4 6 3 4 6 5 2 6 4 6 2 3 2 1 4 1 3 1 1 2 1 2 1 4 3 1 1 2 4) (list 3 4 0 1 4 4 4 1 2 4 1 1 1 4 5 3 1 2 5 5 4 5 3 4 4 3 4 5 7 4 5 3 6 3 7 6 5 4 5 3 8 8 7 7 4 8 5 5 5 7 4 4 8 8 8 5 8 5 8 6 5 4 3 3 3 5 7 3 3 4 5 3 5 6 2 4 3 5 3 2 4 3 4 6 1 5 4 5 4 2 2 4 5 2 4 1 1 0 1) (list 4 0 4 1 2 0 3 3 4 3 1 1 5 3 1 3 6 2 6 2 5 5 4 3 5 4 7 5 7 7 7 5 6 4 3 7 4 4 6 5 4 8 7 6 7 4 5 7 8 6 7 7 5 8 4 4 4 5 5 8 8 4 7 5 5 5 6 4 5 7 7 5 6 6 5 2 4 2 2 6 3 6 2 5 4 2 3 4 3 5 2 1 5 3 3 2 4 4 2) (list 2 1 2 0 1 0 4 3 5 1 3 2 2 1 2 5 2 4 6 5 5 2 4 6 5 5 7 6 3 5 3 7 4 4 3 4 8 4 7 8 6 7 5 8 4 5 7 4 4 7 5 5 6 7 4 4 6 7 7 7 8 6 5 4 5 6 5 3 6 7 5 5 7 4 5 5 3 6 5 3 5 6 6 3 5 5 3 3 2 4 1 4 1 5 2 0 1 2 0) (list 3 3 0 1 0 4 2 3 3 4 1 4 1 5 2 3 2 6 2 5 6 3 6 3 4 7 5 4 5 7 7 7 6 4 5 4 8 5 4 7 8 7 8 6 5 5 5 7 5 5 8 5 8 4 8 7 5 7 7 4 4 6 4 8 8 8 6 6 4 5 7 7 5 6 3 3 4 5 5 6 4 5 4 2 5 2 6 4 3 1 1 5 2 3 1 4 1 4 4) (list 2 0 4 4 2 4 5 5 2 4 1 3 3 5 3 4 5 6 3 2 5 4 3 5 4 6 4 5 7 3 4 4 7 4 5 4 5 8 6 8 8 8 4 4 4 4 7 7 6 5 7 4 6 8 8 7 7 5 5 4 5 8 6 4 4 8 4 7 7 3 5 7 5 5 7 7 7 7 2 4 2 4 6 5 5 5 5 1 1 5 4 5 4 2 4 2 2 3 4) (list 1 0 0 0 0 3 1 3 2 4 4 3 5 5 2 5 6 3 4 5 2 6 7 4 3 6 4 5 5 5 6 4 7 6 8 8 7 7 8 5 7 4 6 5 7 6 5 8 6 5 7 6 5 7 6 7 7 8 4 5 5 5 6 8 5 6 8 7 4 4 4 6 7 6 5 7 7 5 3 4 6 6 6 4 2 3 5 4 5 3 3 2 1 5 1 4 3 1 1) (list 4 2 1 1 2 2 2 3 1 1 3 4 1 3 6 6 2 4 5 2 3 3 7 5 7 7 4 5 6 7 5 4 6 5 6 7 7 7 7 4 5 5 7 6 8 7 6 5 9 5 8 7 8 7 8 9 4 5 5 7 5 7 5 5 6 4 7 8 8 7 5 3 3 3 5 7 6 6 5 5 2 6 4 6 4 5 3 5 5 4 5 5 3 2 4 4 3 1 3) (list 2 2 0 2 3 1 2 5 4 2 3 4 4 5 4 6 6 6 2 6 3 7 3 3 6 3 3 5 5 3 4 4 5 8 6 7 4 5 7 8 4 8 6 9 5 7 5 6 6 7 8 8 9 8 8 9 7 9 6 7 8 5 6 8 5 6 8 8 6 7 6 6 7 5 5 6 5 6 6 5 4 2 2 6 4 2 5 6 4 2 3 1 4 3 2 4 4 2 4) (list 3 0 3 3 1 4 2 5 4 1 5 1 4 5 6 4 4 2 3 4 6 6 3 7 4 6 4 3 3 5 8 6 4 4 6 7 8 6 6 6 5 9 6 6 5 7 9 6 9 6 7 6 5 5 7 6 6 5 7 6 8 4 5 4 5 7 8 4 4 8 8 4 4 6 6 6 6 5 6 4 3 4 6 6 5 5 4 3 4 2 3 2 5 2 3 1 5 1 1) (list 0 0 1 5 5 4 1 1 2 5 1 3 5 6 6 3 3 2 4 3 6 5 7 3 6 4 3 7 7 8 5 6 6 7 8 4 6 4 7 6 6 5 8 7 5 9 8 5 8 9 6 9 9 9 5 8 7 8 7 9 5 8 7 7 6 8 6 4 7 8 4 7 6 4 4 4 6 7 7 3 6 7 4 4 3 3 3 5 2 6 5 5 5 4 2 2 1 1 4) (list 0 3 2 2 2 2 5 3 1 1 3 5 6 4 5 3 5 6 6 4 3 3 6 3 4 5 4 8 4 6 5 8 5 6 6 7 6 5 7 7 7 5 7 8 8 5 8 8 9 6 7 6 8 7 5 7 9 9 5 5 5 9 6 7 8 7 7 5 5 5 8 6 6 8 5 6 3 4 7 4 7 7 2 4 2 5 6 6 3 5 1 5 5 5 1 4 3 4 1) (list 2 0 0 3 3 5 5 5 1 2 4 4 3 6 6 5 5 4 3 7 5 6 4 7 5 5 8 6 6 7 8 5 8 4 8 8 6 8 7 8 7 5 6 7 7 8 6 7 6 6 6 5 6 7 5 6 9 6 9 9 8 9 8 8 9 8 5 5 5 4 4 8 5 8 6 5 7 5 7 6 7 7 5 5 6 6 4 3 3 5 3 5 5 4 5 3 3 5 1) (list 0 1 5 5 2 3 5 5 5 2 5 6 5 4 5 6 5 3 5 7 4 4 5 5 6 3 5 7 6 6 6 4 5 5 6 7 9 7 7 5 7 8 9 6 9 8 7 9 6 6 9 7 6 9 6 7 5 7 8 7 6 8 6 9 6 8 8 4 8 5 7 8 5 8 7 6 5 4 4 5 3 5 7 3 6 2 3 4 3 6 5 2 3 3 1 3 2 4 5) (list 1 2 2 4 1 3 1 5 4 3 5 4 3 4 5 4 2 7 4 7 7 4 6 4 6 8 6 6 6 5 7 6 6 8 5 7 7 6 6 7 6 9 8 9 7 6 5 6 9 9 9 7 6 6 9 8 8 9 6 9 5 9 9 5 5 8 6 6 8 4 4 5 5 5 7 4 7 5 4 4 4 4 5 6 4 4 2 2 3 6 2 2 5 3 4 1 3 4 2) (list 2 3 2 5 1 3 3 3 1 2 4 2 5 5 6 2 3 6 4 7 6 7 3 6 3 4 6 4 8 4 4 7 7 8 6 5 7 5 5 5 7 6 7 9 6 9 8 7 9 6 8 7 9 6 7 8 7 7 8 8 5 5 9 8 9 8 7 6 8 8 6 8 4 4 7 6 4 5 6 6 7 5 7 5 5 2 2 6 2 3 6 4 5 1 1 5 2 5 5) (list 1 5 5 1 1 5 5 1 3 3 4 3 4 5 4 2 4 6 6 7 4 5 6 3 5 5 4 6 6 7 8 6 6 6 8 6 7 5 7 7 8 9 6 9 9 9 6 8 9 9 7 7 6 6 8 7 8 6 9 6 9 5 7 5 8 7 7 8 7 7 5 8 8 8 7 7 7 4 6 6 3 6 3 4 6 6 2 3 3 6 4 2 5 2 4 5 4 2 5) (list 1 2 1 2 1 1 4 2 1 2 3 4 6 2 5 4 7 7 7 7 5 6 5 3 6 8 7 6 4 8 8 4 9 7 8 8 9 5 6 6 5 6 6 8 9 7 9 9 7 8 7 7 6 9 6 7 7 8 6 6 8 5 8 5 9 6 8 8 5 8 6 5 8 6 7 5 4 4 7 4 7 4 3 3 7 6 6 2 6 6 5 2 2 2 3 4 2 4 3) (list 1 2 5 4 1 1 4 1 2 4 6 3 4 5 3 6 5 3 6 4 4 6 6 6 8 7 8 8 7 7 5 9 9 5 5 5 8 8 6 7 6 9 9 6 8 9 6 6 8 7 9 9 7 6 7 9 7 7 8 7 7 9 7 9 7 8 5 5 6 7 8 5 7 7 6 5 5 4 6 6 6 5 5 4 4 3 4 6 2 5 5 4 4 2 4 3 5 3 3) (list 1 2 5 1 1 1 3 3 2 3 6 2 5 2 5 5 4 5 4 6 7 4 6 5 4 8 6 5 6 7 5 8 8 5 6 7 8 8 7 6 8 6 7 7 6 7 7 9 7 9 9 8 8 8 8 9 7 8 6 6 7 6 8 5 8 8 8 8 8 9 7 8 8 6 7 5 6 6 6 5 3 3 6 3 6 3 4 6 6 2 4 2 2 5 1 1 1 4 2) (list 4 3 1 4 5 1 4 2 5 2 2 2 3 6 6 6 5 6 5 5 7 6 4 8 8 5 8 4 5 5 8 7 7 6 6 5 8 6 9 8 9 8 7 8 8 8 7 7 8 8 9 7 9 6 9 9 8 8 8 6 8 9 9 8 7 9 6 7 7 6 5 7 4 8 8 6 5 6 6 5 7 7 4 7 5 6 5 5 2 5 2 5 2 1 1 3 1 1 5) (list 4 3 1 4 4 3 4 4 3 3 4 6 4 3 2 3 6 6 6 6 7 3 4 6 8 4 6 5 8 4 9 6 7 7 8 9 9 8 9 8 7 7 6 6 8 6 6 9 7 7 9 7 9 7 8 9 8 8 8 6 6 8 7 7 6 7 7 6 6 8 7 6 7 7 7 4 5 7 6 7 4 6 4 6 6 6 6 4 2 5 6 5 4 1 3 2 5 3 2) (list 3 5 1 5 2 5 5 4 5 6 5 6 3 5 4 6 6 3 3 3 6 5 8 4 7 7 5 5 5 6 6 7 6 9 9 5 5 7 9 6 8 6 6 8 8 8 9 8 9 8 9 8 9 9 7 7 6 7 6 7 8 6 7 7 6 6 7 7 9 8 8 4 8 6 8 8 8 8 5 3 6 6 6 4 3 4 5 3 6 6 6 6 2 4 3 1 3 1 3) (list 2 1 5 3 3 2 5 1 2 5 3 2 5 5 3 5 6 3 5 7 7 7 5 7 4 7 7 4 7 6 6 9 8 9 6 5 7 7 6 6 7 8 8 8 9 8 8 9 9 9 8 8 8 9 9 8 9 8 8 8 7 8 6 9 6 7 8 7 6 5 8 6 4 5 8 6 8 8 4 7 7 7 6 3 3 6 5 4 5 6 4 3 6 1 4 3 1 3 3) (list 1 5 5 3 5 4 3 6 5 3 6 2 5 4 2 5 3 7 7 5 6 7 7 8 6 6 5 6 7 6 5 5 7 8 5 9 6 8 6 9 9 6 7 7 7 7 9 8 9 7 8 7 7 8 9 9 8 7 8 7 8 7 7 7 6 8 5 6 8 7 6 7 5 4 4 7 5 4 7 5 6 4 5 4 7 5 4 2 3 3 3 4 5 3 1 1 4 2 2) (list 2 2 1 2 2 4 2 2 2 5 3 4 2 4 6 5 5 3 7 7 4 3 7 5 7 7 5 5 5 9 8 5 9 5 7 8 8 8 8 7 7 9 6 6 9 8 9 8 9 7 7 8 7 8 7 9 7 8 7 6 9 8 9 6 7 5 5 7 6 9 9 8 7 7 5 8 4 6 8 7 6 7 3 3 6 7 6 4 5 4 2 6 4 2 1 4 3 5 3) (list 4 5 2 4 3 2 4 5 3 2 6 4 6 5 4 6 3 4 3 3 4 5 5 5 4 6 8 5 7 5 5 5 8 9 8 5 7 7 7 6 6 6 6 6 8 7 9 7 9 7 7 9 8 7 7 9 8 9 9 6 9 9 7 7 6 6 7 9 6 8 9 9 8 4 5 8 4 6 7 4 7 4 4 7 3 7 5 4 4 2 2 5 2 5 4 2 3 4 2) (list 4 5 3 2 3 1 3 3 5 5 5 3 4 2 4 4 4 4 4 5 6 6 7 5 5 4 5 6 8 7 8 7 7 5 6 5 8 8 8 7 8 9 7 8 9 7 9 8 9 9 7 8 9 9 7 9 7 8 7 8 7 7 8 7 8 8 8 7 7 9 5 6 7 5 5 7 7 4 6 6 7 3 3 7 3 4 4 5 4 6 6 3 6 4 1 4 3 4 3) (list 2 5 3 5 4 1 1 6 2 5 2 5 5 6 4 6 7 6 7 7 7 3 5 7 8 7 6 4 7 8 9 9 5 8 8 5 6 7 7 9 6 8 6 9 9 9 8 7 7 9 8 8 9 8 8 7 7 7 7 6 6 8 9 6 8 9 5 5 7 9 5 8 4 7 5 6 7 6 7 6 6 3 7 7 5 7 5 4 5 5 5 6 5 4 5 2 3 2 1) (list 5 5 5 4 1 4 5 4 2 5 3 6 4 6 5 7 3 6 6 7 3 7 7 5 4 7 5 5 8 5 8 7 5 8 8 8 7 8 8 6 8 6 6 9 7 7 7 7 8 8 9 7 9 8 9 8 9 7 8 9 9 7 6 9 9 6 7 6 7 6 6 6 7 6 8 6 6 6 4 3 3 4 6 5 4 5 7 3 6 2 5 3 2 2 1 4 5 5 5) (list 2 2 4 1 2 4 2 3 6 4 4 6 6 2 6 4 3 6 7 6 4 7 6 4 7 5 7 4 8 9 5 7 9 7 6 5 8 6 8 7 8 6 7 6 9 8 8 9 8 8 8 8 8 8 9 8 7 8 9 9 9 9 8 8 9 8 6 8 7 7 9 8 6 4 6 5 5 5 4 3 3 4 7 4 6 4 5 2 2 4 6 6 3 4 5 4 3 2 2) (list 2 5 5 3 3 2 5 2 6 2 4 6 3 6 2 4 7 7 7 5 7 3 7 8 8 6 7 4 4 6 6 8 6 5 7 7 6 7 9 6 9 8 6 8 9 7 8 8 7 9 7 8 8 9 9 9 9 8 6 6 9 9 9 6 6 8 5 8 7 7 5 7 6 4 7 5 6 5 6 7 5 5 4 5 4 4 5 6 6 2 6 6 2 6 4 4 5 4 1) (list 5 4 2 5 5 4 4 6 3 4 3 3 5 6 4 5 4 5 6 7 4 6 8 8 4 7 7 6 5 8 8 9 9 8 9 6 7 8 9 6 8 6 8 6 9 7 7 9 8 9 8 7 7 8 7 9 8 8 7 9 7 8 6 8 8 7 7 8 8 5 8 7 7 4 8 5 4 5 7 7 4 7 5 7 5 6 6 3 2 3 4 2 6 5 2 1 3 2 2) (list 2 2 1 3 2 3 5 2 5 5 3 5 2 3 4 3 3 3 5 3 3 7 4 7 4 6 7 7 5 5 8 6 7 5 8 7 6 8 9 6 9 7 6 6 8 9 9 9 7 9 9 9 8 8 8 7 9 9 8 9 9 7 7 8 8 9 9 9 5 8 5 5 6 7 6 8 6 5 6 3 6 5 6 6 3 3 6 6 5 2 6 3 6 3 1 4 3 2 4) (list 1 4 2 1 5 3 3 4 4 2 5 5 4 2 4 5 3 5 5 6 3 5 8 6 5 6 5 7 7 6 8 9 6 7 6 9 7 7 9 7 7 6 7 8 9 8 7 7 7 7 7 7 8 9 8 6 6 8 7 6 9 7 9 7 6 5 6 6 8 5 7 8 8 4 6 4 5 5 4 6 4 7 7 4 7 5 4 3 3 2 3 5 2 3 2 2 5 2 4) (list 4 5 5 1 4 4 1 4 3 4 6 6 2 6 6 7 6 6 6 4 6 7 7 5 4 8 6 4 6 4 9 8 8 7 6 6 5 7 7 9 8 6 7 9 6 7 8 6 6 9 7 7 6 8 9 7 7 8 8 8 7 6 9 9 9 7 7 5 9 8 5 4 4 5 8 6 7 4 3 7 6 3 5 4 7 4 4 4 3 4 3 5 5 3 2 5 1 3 2) (list 3 5 4 2 3 3 5 4 2 5 4 2 5 3 3 5 7 4 4 3 5 4 7 7 7 8 6 6 7 4 6 5 8 7 5 6 9 8 9 9 6 9 6 8 9 6 7 8 7 9 8 9 7 8 7 9 9 7 7 6 7 8 8 6 7 7 7 6 6 9 5 7 5 5 4 7 7 7 3 3 7 5 7 5 3 4 2 5 4 3 3 3 2 1 3 4 3 5 2) (list 3 1 4 3 2 2 2 2 6 5 5 2 4 2 3 4 4 5 6 7 4 3 6 7 6 5 6 8 5 5 8 9 5 7 9 5 6 6 8 7 7 6 7 9 9 7 8 6 9 9 7 6 7 7 9 9 6 6 9 7 8 6 9 5 8 6 8 9 9 6 5 4 6 8 4 5 7 8 7 5 4 3 3 7 5 6 6 3 4 3 3 2 6 2 3 1 5 3 1) (list 3 5 5 3 1 2 1 4 2 4 2 2 3 2 2 2 7 5 3 4 3 7 7 5 8 6 8 8 7 6 6 8 6 5 7 7 8 7 9 5 6 7 9 6 6 8 8 8 9 9 8 6 8 7 6 7 9 7 9 7 8 9 5 9 9 7 6 5 8 5 7 6 7 6 5 4 6 8 6 7 7 5 3 7 3 2 6 5 5 2 5 4 6 4 4 4 2 4 1) (list 2 3 5 2 5 2 5 3 5 4 2 2 5 5 4 6 6 7 3 6 6 4 5 3 8 4 8 6 7 4 8 5 5 7 9 5 7 8 8 7 5 8 9 8 9 7 7 8 9 9 6 6 9 7 8 9 7 6 8 7 7 5 6 8 9 7 9 7 5 4 6 8 5 6 4 8 8 5 5 4 3 3 5 3 3 3 4 4 5 5 5 2 2 1 5 2 2 4 2) (list 3 3 3 2 2 5 4 2 2 3 4 2 6 6 6 5 5 4 3 7 4 4 3 3 8 4 8 5 4 6 7 7 9 9 5 7 5 7 5 5 8 9 7 6 8 8 7 7 9 7 8 7 6 6 6 9 6 6 9 7 5 5 7 7 9 6 9 6 7 6 5 4 7 5 7 6 8 4 3 3 7 5 5 7 6 4 5 5 2 2 5 5 1 2 1 5 1 3 4) (list 3 3 5 1 3 1 2 3 5 5 5 5 5 6 3 2 6 7 7 4 5 4 5 5 6 6 8 5 4 4 8 7 5 8 5 9 9 9 8 7 9 6 8 9 7 9 8 6 6 9 7 9 7 6 9 6 8 9 5 7 7 7 8 6 7 5 9 5 7 4 5 4 4 8 8 4 6 3 5 4 6 3 5 7 3 4 6 4 2 4 2 3 4 5 1 1 4 3 4) (list 0 1 1 3 2 1 5 4 5 4 3 2 2 6 4 3 6 3 5 6 5 3 6 7 4 4 8 5 7 6 7 6 5 6 6 8 9 7 7 9 5 8 6 6 7 9 6 9 8 8 9 6 8 7 6 7 6 7 7 5 8 5 5 6 8 7 5 6 5 8 8 5 8 5 7 5 4 3 4 7 3 3 3 5 4 4 3 2 5 5 3 1 3 1 2 2 5 1 2) (list 4 4 1 2 4 1 1 3 1 5 6 3 2 5 4 4 4 5 3 4 3 7 7 5 3 3 6 8 4 5 6 6 7 4 6 7 9 9 6 5 8 9 6 9 7 6 6 5 9 5 8 6 8 7 5 9 9 8 6 5 8 6 8 6 9 5 5 4 6 7 7 4 8 4 5 3 7 5 6 7 5 6 4 4 5 3 5 3 6 4 6 1 3 4 3 5 1 1 3) (list 2 3 3 5 5 5 4 3 4 2 3 4 6 4 4 5 6 5 3 5 6 4 5 6 6 4 6 5 7 8 5 8 7 4 8 8 8 5 5 9 8 9 8 8 8 6 8 8 9 9 7 8 6 6 8 8 6 8 9 6 8 7 8 7 9 8 6 7 8 8 7 4 6 8 8 7 7 4 7 3 4 6 6 2 5 4 3 3 3 6 4 2 2 3 2 5 1 2 4) (list 1 3 4 5 2 2 1 4 2 1 1 2 4 4 6 6 3 4 2 6 7 6 7 3 3 7 3 5 5 7 5 4 4 6 4 4 6 5 9 9 7 8 8 6 6 5 7 7 6 6 7 9 6 5 5 7 6 7 6 8 6 7 7 6 7 4 4 6 8 5 4 8 7 5 3 4 6 7 5 7 6 5 2 5 2 6 4 4 2 2 1 1 1 5 5 1 3 4 2) (list 4 4 0 2 3 4 2 3 2 5 1 2 6 6 5 2 4 2 5 6 4 4 7 6 6 5 5 5 7 8 6 7 8 6 5 6 4 8 7 5 9 6 7 6 5 5 9 5 6 9 6 6 6 7 8 5 7 9 8 9 5 9 8 8 7 6 8 8 6 7 6 4 8 4 5 3 6 6 6 3 3 3 3 4 6 3 4 2 2 3 5 2 2 1 3 5 2 4 1) (list 2 0 1 1 2 3 3 3 3 2 3 1 5 3 4 4 3 4 6 4 5 5 5 4 5 5 3 3 4 5 6 7 4 6 7 7 5 7 8 4 5 9 7 7 9 6 7 7 7 6 6 7 7 7 7 9 6 9 6 7 7 5 4 4 7 7 5 5 6 5 6 7 5 7 3 4 4 5 6 7 3 4 5 2 3 3 4 5 4 3 5 4 1 1 5 1 5 1 0) (list 3 3 1 0 1 2 1 1 3 3 5 1 6 6 2 6 2 4 2 5 5 3 3 6 7 6 6 4 5 7 4 5 4 7 6 8 7 8 8 5 8 7 5 9 9 5 8 8 8 8 7 7 9 6 9 8 5 8 9 5 6 7 4 4 4 5 6 5 4 4 4 4 3 4 4 4 5 4 4 4 7 4 4 4 5 6 6 4 5 2 5 2 2 3 4 3 3 3 2) (list 2 2 4 0 1 2 5 1 1 1 3 5 1 4 2 4 3 2 3 4 6 4 5 6 7 6 7 5 6 3 3 6 6 6 7 4 8 8 4 5 8 4 6 4 4 5 8 7 8 8 6 7 7 6 8 5 5 5 6 6 7 4 8 8 6 4 4 5 8 7 6 6 6 7 3 5 3 3 5 7 3 4 5 6 2 3 3 2 4 5 5 5 2 4 2 2 4 1 2) (list 4 2 1 2 3 2 2 5 5 4 2 3 3 6 4 2 5 6 4 5 5 2 6 6 3 6 4 3 5 5 4 5 5 6 4 8 5 8 8 7 6 4 7 8 8 6 8 8 8 4 5 5 8 8 8 7 4 6 8 4 8 5 8 7 5 7 4 8 5 4 4 5 3 3 4 7 7 3 5 4 3 6 3 5 4 4 6 2 4 4 3 2 3 1 4 5 4 2 4) (list 3 3 1 1 0 0 5 3 5 3 1 5 2 5 6 3 4 3 4 6 2 5 6 3 7 4 3 6 7 3 4 3 5 6 4 7 8 5 6 4 7 6 8 7 4 8 6 6 7 6 6 4 4 6 4 4 4 6 8 8 6 4 4 4 5 8 8 5 3 5 6 4 5 6 5 3 7 6 5 2 6 5 3 5 3 3 4 2 4 2 2 5 4 2 4 1 4 0 2) (list 4 0 0 4 3 2 1 4 1 3 1 3 3 5 5 4 2 3 4 4 3 4 4 4 3 6 5 5 4 7 6 5 4 6 4 8 8 6 7 8 5 5 7 6 6 4 4 8 7 5 5 5 5 5 4 6 4 6 5 5 6 7 8 7 6 8 8 7 3 7 3 4 3 7 4 3 4 6 6 3 5 4 3 4 5 3 5 5 1 5 1 4 3 5 2 1 1 1 2) (list 2 1 3 1 1 4 0 3 5 4 4 1 5 4 2 5 6 6 3 4 2 5 5 4 4 5 5 5 4 6 3 3 4 3 4 6 6 6 5 8 4 4 7 7 5 7 6 7 6 6 6 6 7 4 7 8 4 5 7 7 5 6 4 7 5 6 5 5 7 6 6 4 6 6 3 5 2 3 5 3 4 2 4 5 4 4 2 3 5 1 1 2 1 1 4 0 4 1 3) (list 3 1 2 1 4 0 1 5 1 1 3 4 4 3 2 2 6 6 2 5 2 4 5 6 3 5 6 3 3 4 5 6 6 4 4 4 7 6 5 4 8 4 4 7 4 4 7 4 5 5 8 8 6 6 8 7 6 8 4 4 8 4 5 6 7 6 5 7 6 7 4 7 5 3 3 6 2 3 5 2 5 4 3 5 6 4 2 3 5 2 2 4 4 4 2 2 2 4 0) (list 1 1 0 1 1 4 3 0 4 5 2 4 1 1 1 1 2 4 3 6 6 5 3 2 5 5 4 4 5 7 4 3 5 4 5 4 5 4 4 4 8 4 4 6 5 4 6 4 8 5 6 7 7 4 5 7 7 6 7 8 6 4 7 7 3 7 4 6 7 5 7 6 5 6 6 3 2 2 6 3 5 6 5 2 2 2 4 2 1 1 1 4 2 3 4 0 1 1 4) (list 4 0 3 2 4 1 2 4 4 3 3 5 2 1 4 5 5 1 2 3 6 4 3 4 5 5 4 4 3 3 6 4 6 6 4 3 5 7 6 7 5 6 5 6 7 8 4 6 5 8 8 6 8 8 4 4 4 5 5 7 7 3 6 3 7 7 3 5 3 7 7 3 4 3 3 6 6 4 2 6 6 6 4 1 1 4 3 5 1 1 4 1 4 0 0 3 0 2 2) (list 0 4 3 1 4 4 1 4 1 4 2 5 4 3 4 2 1 2 5 3 4 3 5 5 2 2 4 4 5 5 3 6 5 6 5 6 4 3 3 4 6 7 6 4 4 5 3 4 3 5 7 6 6 6 3 3 7 3 5 3 7 4 6 5 5 6 3 3 7 3 3 7 2 4 5 6 5 4 2 2 3 6 2 5 4 1 2 2 3 5 5 5 1 4 1 2 3 1 2) (list 2 0 0 0 0 2 1 2 2 0 3 1 4 4 2 2 4 4 2 2 4 6 3 5 6 5 6 3 2 5 4 7 5 4 4 5 5 5 5 4 4 5 4 3 3 3 6 6 5 4 3 3 5 3 4 3 7 3 4 3 7 5 3 4 5 7 4 5 5 7 7 4 4 3 5 3 5 5 2 2 5 3 2 1 1 4 5 5 3 5 3 1 4 0 2 4 0 0 4) (list 2 3 3 0 3 3 2 2 2 2 2 3 2 3 4 1 5 3 5 3 2 4 5 6 4 5 5 5 4 5 2 2 3 4 6 6 6 5 7 3 7 5 3 4 6 7 5 5 4 3 7 3 4 4 7 7 6 3 6 5 6 7 3 6 3 4 3 6 5 3 2 4 2 6 5 5 4 3 6 6 2 5 4 5 4 4 4 3 5 5 3 1 0 0 1 1 2 2 0) (list 1 0 4 2 1 3 0 3 2 4 3 4 1 4 3 3 5 3 1 2 2 2 2 6 4 6 5 3 4 2 6 4 5 6 4 4 3 7 4 5 4 7 6 5 6 6 3 7 3 7 5 7 5 5 7 3 7 3 4 5 7 6 5 7 7 5 6 4 2 5 6 3 4 5 5 2 4 4 3 4 3 5 2 2 2 3 5 1 2 2 1 4 3 4 1 4 0 1 0) (list 2 2 1 3 0 0 2 1 0 1 0 3 2 2 5 2 3 1 2 2 1 5 4 6 3 4 2 6 4 3 3 6 2 3 3 2 7 6 5 6 6 3 7 3 3 4 7 3 4 3 6 4 7 6 4 7 4 6 5 3 6 7 4 4 7 5 5 6 2 5 4 2 5 6 4 2 2 6 5 1 1 4 5 3 1 4 1 4 5 0 4 3 2 4 1 0 4 0 3) (list 0 0 1 0 0 2 4 3 3 4 4 4 1 3 3 1 5 4 4 3 2 1 2 2 5 2 3 2 2 6 4 6 2 5 3 2 3 2 3 5 6 3 4 5 5 3 3 4 5 7 6 7 7 6 6 3 3 5 6 4 5 3 5 4 3 6 4 4 2 6 5 4 6 4 4 3 5 2 2 4 2 5 3 2 1 2 4 5 0 0 4 1 1 1 2 2 0 2 0) (list 1 0 1 0 1 0 4 1 2 1 3 3 3 0 1 3 1 4 2 5 2 1 3 1 1 4 6 3 3 2 2 6 5 3 4 3 5 3 6 2 4 5 4 5 5 4 7 6 5 5 3 6 3 5 7 7 5 5 6 4 5 6 4 3 6 6 2 6 4 2 6 5 2 4 3 2 4 4 2 3 5 5 4 5 3 5 1 2 4 4 3 1 4 3 0 2 2 2 3) (list 3 3 1 0 0 4 1 3 0 0 4 1 2 1 1 3 1 4 3 5 4 3 5 3 3 1 2 6 6 3 3 2 5 2 5 3 2 3 3 3 5 6 5 2 5 2 5 5 4 3 3 4 7 4 2 4 5 4 2 2 6 2 5 2 5 4 3 4 4 3 3 5 3 3 4 5 5 5 1 5 2 3 5 3 2 4 1 4 3 1 0 3 2 1 2 2 2 2 0) (list 1 1 0 3 3 2 3 0 2 4 2 4 2 4 1 3 1 1 5 4 2 1 3 2 2 4 5 5 3 5 5 2 2 4 4 3 5 4 5 4 6 3 4 4 5 5 6 2 6 5 6 5 5 2 5 2 3 5 4 2 6 5 3 5 6 3 6 5 5 4 5 3 2 3 3 3 2 3 2 1 1 3 5 4 4 1 3 3 3 4 4 3 1 4 4 0 3 0 0) (list 3 1 0 0 0 2 1 3 3 1 2 2 1 1 2 1 1 4 2 4 3 5 2 4 1 4 2 2 5 1 3 5 5 5 6 5 4 5 5 6 3 5 6 2 6 6 5 3 4 6 4 4 6 2 3 5 2 5 5 5 2 4 3 4 4 6 6 6 5 6 3 4 4 3 5 4 5 5 1 5 3 5 4 1 1 3 1 1 2 2 1 0 0 2 3 1 0 3 1) (list 2 2 1 0 1 3 0 3 4 3 4 0 1 0 1 1 2 1 2 4 2 2 1 4 4 5 5 2 5 3 3 5 5 2 6 4 2 5 2 4 4 5 6 5 4 4 4 6 3 5 6 3 6 3 3 4 6 4 6 6 5 4 2 3 2 3 3 2 2 5 4 3 1 5 5 3 2 1 3 5 3 1 2 3 0 1 2 0 1 2 1 4 3 0 2 0 0 3 1) (list 3 1 2 3 2 3 0 3 1 2 2 3 3 2 1 2 4 0 4 4 5 3 1 1 4 2 4 5 2 5 2 4 1 1 3 6 5 5 4 5 4 3 3 5 3 5 4 4 6 5 5 5 4 3 3 5 6 3 2 4 4 2 4 4 2 2 2 4 2 4 3 3 1 5 5 4 3 3 4 2 4 3 0 2 1 3 4 4 1 2 2 0 2 1 0 3 1 0 3) (list 2 0 0 3 3 1 1 0 3 2 2 2 2 3 2 4 3 0 3 1 2 3 1 1 5 2 3 1 3 1 4 2 2 2 1 5 2 4 2 5 4 6 5 2 4 3 5 4 4 5 2 6 4 5 2 4 3 2 2 6 4 5 5 5 2 3 5 5 2 5 3 1 1 4 1 1 3 4 1 2 1 0 4 4 4 2 0 0 2 1 3 0 3 2 3 0 3 2 1) (list 0 0 3 2 2 1 0 3 2 3 2 0 3 3 4 2 3 1 3 2 3 4 3 4 3 1 1 5 4 3 3 1 3 5 4 4 4 2 1 2 5 6 3 6 6 6 2 6 3 3 6 5 4 5 5 3 3 5 3 2 5 2 3 3 2 4 2 5 3 5 3 4 2 5 5 5 5 4 2 1 1 1 1 0 4 3 2 3 2 0 0 3 0 0 0 1 3 2 0) (list 0 0 2 0 0 1 2 1 3 0 3 0 4 1 0 0 3 1 1 2 1 1 1 1 1 3 1 1 2 1 1 4 2 3 2 2 4 5 2 3 5 4 1 1 3 1 2 2 3 3 2 2 3 5 3 3 4 4 1 1 2 3 3 4 5 3 2 3 4 4 1 1 3 4 1 4 3 1 4 2 3 4 0 0 4 1 3 1 1 2 0 3 2 1 3 0 3 2 1) (list 2 1 1 2 0 3 3 3 1 3 2 3 1 1 4 3 2 2 4 1 1 1 4 2 4 2 1 2 3 4 4 2 4 5 5 5 3 1 5 4 3 2 3 4 4 2 4 3 2 5 4 5 1 2 4 3 3 3 1 2 1 2 2 5 2 4 3 1 1 4 4 3 2 1 5 3 2 0 3 0 0 4 2 0 4 4 3 4 1 0 3 1 2 3 1 3 3 3 0) (list 1 2 1 2 0 3 0 3 0 2 1 0 3 0 3 4 4 3 0 0 4 1 3 4 2 4 2 3 3 1 3 5 4 2 2 5 4 2 5 4 1 1 4 1 2 1 5 3 2 2 3 4 5 4 4 2 4 4 2 3 4 5 3 4 5 5 4 4 5 4 1 1 5 3 1 2 0 0 3 4 0 2 4 3 1 4 0 3 2 1 3 3 0 1 3 2 3 0 0) (list 0 2 0 0 1 3 2 0 3 1 3 3 2 0 3 1 2 2 0 3 3 3 4 1 4 2 2 1 4 2 2 4 1 3 3 4 2 2 5 5 3 4 1 1 4 1 1 5 4 3 3 1 1 1 1 2 2 1 3 5 1 5 2 5 2 1 2 1 1 3 2 2 3 3 2 3 3 3 1 1 1 2 3 0 1 1 1 3 0 3 3 1 3 3 0 1 0 1 1) (list 1 0 0 1 2 2 1 3 1 0 0 0 2 1 1 0 3 4 2 2 3 3 0 1 0 3 4 0 1 2 4 1 5 3 2 2 2 3 4 1 2 2 1 5 4 1 4 3 5 2 2 3 1 3 2 3 5 5 4 5 2 5 5 1 3 4 1 5 5 1 4 3 1 2 2 0 0 0 3 2 1 2 4 2 0 1 0 0 3 2 1 3 2 1 1 2 0 1 0) (list 0 2 2 2 1 0 1 3 0 0 0 0 1 3 1 1 2 1 1 0 0 4 2 0 2 0 3 4 1 1 4 3 1 3 1 2 4 3 3 1 2 3 1 4 4 3 3 5 2 5 4 4 5 1 4 5 4 4 2 1 4 3 5 4 5 5 3 3 3 1 4 2 2 0 0 1 0 4 1 3 2 0 1 0 1 1 3 1 1 1 1 2 2 2 2 2 1 2 1)))) (defun row (row arr) (declare (type array arr) (type fixnum row)) (loop :for i :from 0 :below (car (array-dimensions arr)) :collect (aref arr row i))) (defun column (column arr) (declare (type array arr) (type fixnum column)) (loop :for i :from 0 :below (second (array-dimensions arr)) :collect (aref arr i column))) (defun visible (row column &optional (problem-input +problem-8-input+)) (destructuring-bind (n m) (array-dimensions problem-input) (let* ((current-row (row row problem-input)) (current-column (column column problem-input)) (current (aref problem-input row column)) (top-max (apply #'max (subseq current-column 0 row))) (bottom-max (apply #'max (subseq current-column (1+ row)))) (left-max (apply #'max (subseq current-row 0 column))) (right-max (apply #'max (subseq current-row (1+ column))))) (or (> current top-max) (> current bottom-max) (> current left-max) (> current right-max))))) (defun part1 (&optional (problem-input +problem-8-input+)) (let ((visible 0)) (destructuring-bind (n m) (array-dimensions problem-input) (loop :for i :from 1 :below (1- n) :do (loop :for j :from 1 :below (1- m) :if (visible i j problem-input) :do (incf visible))) (+ visible 4 (* 2 (- n 2)) (* 2 (- m 2)))))) (defun furthest (l &key from direction) (declare (type list l) (type fixnum from) (type symbol direction)) (let ((current (nth from l)) (distance 0)) (cond ((or (eq direction 'top) (eq direction 'left)) (loop :for i :downfrom (1- from) :to 0 :do (progn (incf distance) (when (<= current (nth i l)) (return)))) distance) ((or (eq direction 'bottom) (eq direction 'right)) (loop :for i :from (1+ from) :to (1- (length l)) :do (progn (incf distance) (when (<= current (nth i l)) (return)))) distance) (t (error (format nil "Unknown direction ~a~%" direction)))))) (defun view-distance (row column &optional (problem-input +problem-8-input+)) (destructuring-bind (n m) (array-dimensions problem-input) (let* ((current-row (row row problem-input)) (current-column (column column problem-input)) (view-top (furthest current-column :from row :direction 'top)) (view-bottom (furthest current-column :from row :direction 'bottom)) (view-left (furthest current-row :from column :direction 'left)) (view-right (furthest current-row :from column :direction 'right))) (* view-top view-bottom view-left view-right)))) (defun part2 (&optional (problem-input +problem-8-input+)) (destructuring-bind (n m) (array-dimensions problem-input) (loop :for i :from 0 :below n :append (loop :for j :from 0 :below m :collect (view-distance i j problem-input)))))