aboutsummaryrefslogtreecommitdiff
path: root/2022/8.lisp
blob: a09a0cfc57f24af1503c97ea79808f0ecdac3267 (plain)
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
;;;; 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)))))