advent-of-code/2018-12-13.lisp -rw-r--r-- 27.3 KiB View raw
                                                                                
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
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
(defpackage "AOC/13" (:use "CL"))
(in-package "AOC/13")

(defvar *test-input* "/->-\\
|   |  /----\\
| /-+--+-\\  |
| | |  | v  |
\\-+-/  \\-+--/
  \\------/   ")

(defvar *test-input-2* "/>-<\\
|   |
| /<+-\\
| | | v
\\>+</ |
  |   ^
  \\<->/")

(defvar *input* "                      /---------------------\\           /----------------<---------------------------------------------------------------------\\
                      |                     |           |         /---------------------------\\                                                |
              /-------+---------------------+-----------+---------+---------------------------+------\\                                         |
   /----------+-------+---------------------+---\\      /+---------+---------------------------+------+------\\                                  |
 /-+----------+-------+---------------------+---+------++---------+-------------------------\\ |      |      |                                  |
 | |          |       |  /------------------+---+------++---------+-----\\                   | | /----+------+---------------------------\\      |
 | |   /------+-------+--+------------------+---+-\\    ||         |     |              /----+-+-+----+------+----------------\\          |      |
 | |   |      | /-----+--+------------------+---+-+----++---------+-----+--------------+----+-+-+----+---\\  |                |          |      |
 | |   |      | |    /+--+--------------\\   |   | |    ||    /----+-----+--------------+----+-+-+----+---+--+----------------+---------\\|      |
 | |   |      | |    ||  |              |   |   | |    ||    |    |     |              |    | | |    |   |  |                |         ||      |
 | |   |      | |    ||  |      /-------+---+-\\ | |    ||    |    |     |              |    | | |    |   |  |        /-------+---------++------+---\\
 | |   |      | |    ||  |      |       |   | | | |    ||    |    |     |     /--------+----+-+-+----+---+\\ |        |       |         ||      |   |
 | |   |      | |    ||  |      |       |   | | | |    ||    |/---+-----+\\    |        |    | | |    |   || |        |       |         ||      |   |
 | |   |    /-+-+----++--+------+-------+---+-+-+-+----++----++---+-----++--->+--------+----+-+-+----+---++-+-----\\  |       |         ||      |   |
 | |   |    | | |   /++--+------+-------+---+-+-+-+----++----++---+-----++----+--------+----+-+-+----+---++-+-----+--+-------+-\\       ||      |   |
 | |  /+----+-+-+---+++--+------+-------+---+-+-+-+----++-\\  ||   |     ||    |        |    | | |    |   || |     |  |       | |       ||      |   |
 | |  ||    | | |   |||  |      |       |   | | | |    || | /++---+-----++----+--------+----+-+-+-\\  |   || |     |  |       | |       ||      |   |
 | |  ||    |/+-+---+++--+------+-------+---+-+-+-+----++-+-+++---+\\  /-++----+--\\     |    | | | |  |   || |     |  |       | |/------++--\\   |   |
 | |  ||    ||| |/--+++--+------+-------+---+-+-+-+----++\\| |||   ||  | ||    |  | /---+----+-+-+-+--+---++-+----\\|  |       | ||      ||  |   |   |
 | |  ||    ||| ||  |||  |/-----+-------+---+-+-+-+----++++-+++---++--+-++----+--+-+---+----+-+-+-+--+---++-+----++--+-------+-++---\\  ||  |   |   |
 | |  ||    ||| ||  |\\+--++-----+-------/   | | | |    |||| |||   v|  | ||    |  | |   |    | | | |  |/--++-+----++--+-------+-++---+--++--+---+--\\|
/+-+--++----+++-++--+-+--++-----+-----------+-+-+-+----++++-+++---++--+-++----+--+-+-\\ \\----+-+-+-+--++--++-+----++--+-------/ ||   |  ||  |   |  ||
|| | /++----+++-++--+-+--++-----+-----------+-+-+-+----++++-+++---++--+-++---\\|  | | |      | | | |  ||  || |    ||  |         ||   |  ||  |   |  ||
|| | |||    ||| ||  | |  ||     |           | | | |/---++++-+++---++--+-++---++--+-+-+------+-+-+-+--++--++-+----++--+---------++--\\|  ||  |   |  ||
|| | |||/---+++-++--+-+--++-----+-----------+-+-+-++---++++-+++---++--+-++---++--+-+-+---\\  | | | |  ||  || |    ||  |         ||  ||  ||  |   |  ||
|| | ||||   ||| ||  | |  ||     |           | | | ||   |||| |||   ||  | ||/--++--+-+-+---+--+-+\\| |  ||  || |    ||  |         ||  ||  ||  |   |  ||
|| | ||||   ||| || /+-+--++-----+-----------+-+-+-++---++++-+++---++--+-+++--++--+-+-+---+--+-+++-+--++--++-+----++--+-------\\ ||  ||  ||  |   |  ||
|| | ||||   ||| \\+-++-+--++-----+-----------+-+-+-++---++++-+++---++--+-+++--++--+-+-+---+--+-+++-+--++--/| |    ||  \\-------+-++--++--++--+---+--+/
|| | ||||   |||  |/++-+--++-----+-----------+-+-+-++---++++-+++---++--+-+++\\ ||  | | |   |  | ||| |  ||   | |    ||          | ||  ||  ||  |   |  |
|| | ||||   |||  |||| |  ||     |           | | | ||   |||| |||   ||  | |||| ||  | | |   |  | ||| |  ||   | |    ||          | ||  ||  ||  |   |  |
|| |/++++---+++--++++-+--++---\\ |           | | | ||   |||| |||   ||/-+-++++-++--+-+-+---+--+-+++-+--++---+-+----++----------+-++--++--++--+---+--+\\
|| ||||||   |||  |||| |  ||   | |           | | | ||   |||| |\\+---+++-+-++++-++--+-+-+---+--+-+++-+--++---+-+----++----------+-++--++--/|  |   |  ||
|| ||||||   |||  |||| |  ||   | |  /--------+-+-+-++---++++-+-+---+++-+-++++-++--+-+-+---+-\\| ||| |  ||   | |    ||          | ||  ||   |  |   |  ||
|| ||||||   |||  |||| | /++---+-+--+--------+-+-+-++---++++-+-+---+++-+-++++-++--+-+-+---+-++-+++-+--++-\\ | |    || /--------+-++--++---+--+\\  |  ||
|| ||||||   |||  |||| | |||   | |  |   /----+-+-+-++---++++-+-+---+++-+-++++-++--+-+-+---+-++-+++-+--++-+-+-+----++-+--------+-++--++---+--++--+-\\||
|| ||||||   |||  |||| | |||   | |  |   |    | | | ||  /++++-+-+--\\||| | |||| ||  |/+-+---+-++-+++-+--++-+-+-+----++-+--------+-++--++---+--++-\\| |||
|| ||||||   |||  |||| | |||  /+-+--+---+----+-+-+-++--+++++-+-+--++++-+-++++-++--+++-+---+-++-+++-+--++-+-+-+----++-+--\\     | ||  ||   |  || || |||
|| |||||| /-+++--++++-+-+++--++-+--+---+----+-+\\| ||  ||||| | |  |||| | |||| ||  ||| |   | || ||| |  || | | |    || |  |   /-+-++--++---+\\ || || |||
|| |||||| | |||  |||| \\-+++--++-+--+---+----/ ||| ||  ||||| | |  |||| | |||| ||  ||| |   | || ||| |  || | | |    || |  |   | | ||  ||   || || || |||
|| ||||\\+-+-+++--++++---+++--++-+--+---+>-----+++-/|  ||||| | |  |||\\-+-++++-++--+++-+---+-++-+++-+--++-+-+-+----++-+--+---+-+-++--++---++-++-++-++/
|| |||| | | |||  ||||   |||  || |  |   |/-----+++--+--+++++-+-+--+++--+-++++-++--+++-+---+-++-+++-+--++-+-+-+-\\  || |  |   | | ||  ||   || || || ||
|| |||| | | |||  |\\++---+++--++-+--+---++-----+++--+--+++++-+-+--+++--+-+++//++--+++-+---+-++-+++-+--++-+-+-+-+--++-+--+---+\\| ||  ||   || || || ||
|| |||| | | |||  | |\\---+++--++-+--+---++-----+++--+--+++++-+-+--+++--+>+++-+++--+++-+---+-++-+++-+--++-+-+-+-+--++-+--+---+++-/|  ||   || || || ||
|| |||| | | |||  | |    |||  || |  | /-++-----+++--+--+++++-+-+--+++--+-+++-+++--+++-+---+-++-+++-+--++-+-+-+-+--++-+--+---+++--+--++-<-++-++-++\\||
|| |||\\-+-+-+++--+-+----+++--++-+--+-+-++-----+++--+--++++/ | |  |||  | ||| |||  ||| |   | || ||| |  || |/+-+-+--++-+--+---+++--+--++---++-++-+++++\\
|| |||  | | |||  | |    |||  || |  | | ||     |||  |  ||||  \\-+--+++--+-+++-+++--+++-+---+-++-+++-/  || ||| | |  || |  |   |||  |  ||   || || ||||||
|| |||  | | |||  | |    |||  || |  | | ||/----+++--+--++++----+\\ |||  | ||| |||  |||/+---+-++-+++----++-+++-+-+--++-+--+---+++--+--++--\\|| || ||||||
|| |||  | | |||  | |    |||  || |  |/+-+++----+++--+--++++----++-+++--+-+++-+++--+++++---+-++-+++----++-+++-+-+--++-+--+---+++-\\|  ||  ||| || ||||||
|| \\++--+-+-+++--+-+----+++--++-+--+++-+++----++/  |  ||||    || |||  \\-+++-+++--/||||   | || |||    || ||| | |  || |  |   ||| ||  ||  ||| || ||||||
||  ||  | | |||  | |    |||  || |  ||| |||    ||   |  ||||    || |||    ||| ||\\---++++---+-++-+++----++-++/ | |  || |  |   ||| ||  ||  ||| || ||||||
||  ||  | | |||  | |    |||  || |  ||| |||    ||   |  ||||    \\+-+++----+/| \\+----++++---+-++-+++----++-++--+-+--++-+--+---+/| ||  ||  ||| || ||||||
||  || /+-+-+++--+-+----+++--++-+--+++-+++----++---+--++++-----+-+++----+-+--+----++++---+\\|| |||    || ||  | |  || \\--+---+-+-++--++--+++-+/ ||||||
||  || || | |||  | |   /+++--++-+--+++-+++----++---+--++++-----+-+++----+-+--+----++++---++++-+++----++-++--+-+--++--\\ |   | | ||  ||  ||| |  ||||||
||  || || | |||  | |   ||||  || |  ||| |||    ||   |  ||||     | |\\+----+-+--+----++++---++++-/||    || ||  | |  ||  | |   | | ||  ||  ||| |  ||||||
||  || || | |||  | |  /++++--++-+--+++-+++----++---+--++++-----+-+-+----+-+--+----++++---++++--++----++-++--+-+--++--+-+---+-+-++-\\||  ||| |  ||||||
||  || || | |||  | |  |||||  || |  ||| |||    ||   |  ||||     | | |    | |  |    ||||   |||| /++----++-++--+-+--++--+\\|   |/+-++-+++\\ ||| |  ||||||
||  || || | |||  | |  |||||  || |  ||| |||    ||   |/-++++-----+-+-+----+-+--+----++++---++++-+++\\   || ||  | |  ||  |||   ||| || |||| ||| |  ||||||
||  || || | |||  | | /+++++--++-+--+++<+++----++---++-++++-----+-+-+----+-+--+----++++---++++-++++---++-++--+\\|  ||  |||   ||| || |||| ||| |  ||||||
||  || || | |||  | | ||||||  || |  |\\+-+++----++---++-++++-----+-+-+----+-+--+----++++---++++-++++---++-++--+++--++--+++---+++-/| |||| ||| |  ||||||
||  || || | |||  | | |||\\++--++-+--+-+-+++----++---++-++++-----+-+-+----+-+--+----++++---++++-++++---++-/|  |||  ||  |||   |||  | |||| ||| |  |^||||
||  || || | |||  | |/+++-++--++-+--+-+-+++----++---++-++++-----+-+-+----+-+--+----++++\\  |||| ||||   |\\--+--+++--++--+++---+++--+-++++-+++-+--++++/|
||  || || | |||  | ||||| ||  || |  | | |||    ||   || ||||     | | |    | |  |    ||\\++--++++-++++---+---+--+++--++--+++---+++--+-++++-/|| |  |||| |
||  || || | |||  | ||||| ||  || |  | | |||    ||   || ||||     | | |    | |  |    || ||  |||| ||||   |   |  |||  ||  |||   |||  | ||||  || |  |||| |
||  || || | \\++--+-+++++-++--++-+--+-+-+++----++---++-++++-----+-+-+----+-+--+----++-++--++++-++++---+---+--+++--+/  |||   |||  | ||||  || |  |||| |
||  || || |  ||  | ||||| ||  || |  | | |||    ||   || ||||     | | |    | |  |    || ||  |||| ||||   |   |  |||  |   |||   |||  | ||||  || |  |||| |
||  ||/++-+--++--+-+++++-++--++-+--+-+-+++----++---++-++++-----+-+-+----+-+--+----++-++\\ |||| ||||   |   |  |||  |   |||   |||  | ||||  || |  |||| |
||  \\++++-+--++--+-+++++-++--+/ |  | | ||| /--++---++-++++-----+-+-+----+-+--+----++-+++-++++-++++>--+---+--+++--+---+++---+++--+\\||||  || |  |||| |
||   |||| |  ||  | ||||| |\\--+--+--+-+-+++-+--++---++-++++-----+-+-+----+-+--+----++-+++-++++-++++---+---+--+++--+---+++---+++--++++/|  || |  |||| |
||   |||| |  ||  | ||||| |   |  |  | | ||\\-+--++---++-++++-----/ | |    |/+--+----++-+++\\|||| ||||   |/--+--+++--+---+++---+++--++++-+--++-+-\\|||| |
||   |||| |  ||  | ||||| |   |  |  | | ||  |/-++---++-++++-------+-+----+++--+----++-++++++++-++++---++--+--+++--+---+++---+++--++++-+--++\\| ||||| |
||   |||| |  ||  | ||||| | /-+--+--+-+-++--++-++---++-++++-------+-+----+++--+----++-++++++++-++++---++--+--+++\\ |   |||   |||  |||| |  |||| ||||| |
|\\---++++-+--++--+-+++++-+-+-+--+--+-+-++--++-++---++-++++-------+-+----+++--+----++-+++++++/ ||||   ||  |  |||| |   |||   |||  |||| |  |||| ||||| |
|    |||\\-+--++--+-+++++-+-+-+--+--+-+-++--++-++---++-++++-------+-+----+++--+----++-++++/||  ||||   ||  |  |||| |   |||   |||  |||| |  |||| ||||| |
|    |||/-+--++--+-+++++-+-+-+--+--+-+-++--++-++---++-++++-------+-+-\\  |||  |    || |||| ||  ||||   ||  |  |||| |   |||   |||  |||| |  |||| ||||| |
|    |||| |  ||  | ||||| | | |  |  | | ||  || ||   |\\-++++-------+-+-+--+++--+----++-++++-++--+++/   ||  |  |||| |   |||   |||  \\+++-+--+++/ ||||| |
|    |||| |  ||  | ||||| | | |/-+--+-+-++--++-++---+--++++-------+-+-+--+++--+----++-++++-++--+++----++--+--++++\\|   |||   |||   ||| |  |||  ||||| |
|    |||| |  ||  | ||||| | | || |  | | ||  || || /-+--++++-------+-+-+--+++--+--\\ || |||| ||  |||    ||  |  ||||||   |||   |||   ||| |  |||  ||||| |
|    |||| |  ||  | ||||| \\-+-++-+--+-+-++--++-++-+-+--++++-------+-+-+--/||  |  | || |||| ||  |||    ||  |  ||||||   |||   |||   ||| |  |||  ||||| |
|    |||| |  ||  | |||||   | || |  | | ||  || || | |  |||| /-----+-+-+---++--+--+-++-++++-++--+++----++--+--++++++---+++---+++\\  ||| |  |||  ||||| |
|    |||| |  \\+--+-+++++---+-++-+--+-+-++--++-++-+-+--++++-+-----+-/ |   ||  |  | || |||| ||  |||   /++--+--++++++\\  |||   |||| /+++-+--+++\\ ||||| |
|    |||| \\---+--+-+++++---+-++-+--+-+-++--++-+/ v |  |\\++-+-----+---+---++--+--+-++-++++-++--+++---+++--+--/||||||  |||   |||| |||| |  |||| ||||| |
|    ||||  /--+--+-+++++--\\|/++-+--+-+-++--++-+--+-+--+-++-+-----+---+---++--+--+-++-++++-++--+++---+++--+\\  ||||||  |||   |||| |||| |  |||| ||||| |
|    ||||  |  | /+-+++++--+++++-+--+-+-++--++-+--+-+--+-++-+-----+---+---++-\\|  | || |||| ||  |||   |||/-++--++++++-\\|||   |||| |||| |  |||| ||||| |
|    ||||  |  | || |||||  ||||| |  | | ||  || |  | |  | || |/----+---+---++-++--+-++-++++-++--+++---++++-++--++++++-++++\\  |||| |||| |  |||| ||||| |
\\----++++--+--+-++-+++++--+++++-+--+-+-++--++-+--+-+--+-++-++----+---+---++-++--+-++-/||| ||  |||   |||| ||  |||||| |||||  |||| |||| |  |||| ||||| |
    /++++--+--+-++-+++++\\ |||\\+-+--+-+-++--++-+--+-+--+-++-++----+---+---++-++--+-++--+++-++--+++---++++-++--++++++-+++/|  |||| |||| |  |||| ||||| |
    |||||/-+--+-++-++++++-+++-+-+-\\| \\-++--++-+--+-+--+-++-++----+---+---++-++--+-++--+++-++--+++---++++-++--++++++-+++-+--++++-++++-+--++++-+++/| |
    |||||| |  | || |||||| |\\+-+<+-++---++--++-+--+-+--+-++-++----+---+---++-++--+-++--+++-++--+++---++++-++--++/||| ||| |  |||| |||| |  |||| ||| | |
    |||||| |  | || |||||| | | \\-+-++---++--++-+--+-+--+-++-++----+---+---++-++--+-++--+++-++--+++---++++-++--++-/|| ||| |  |||| |||| |  |||| ||| | |
    |||||| |  | || |||||| | |   | ||   ||  || |  \\-+--+-++-++----+---+---++-++--/ ||  ||| ||  |||   |||| ||  ||  || ||| |  |||| |||| |  |||| ||| | |
    |||||| |  | || |||\\++-+-+---+-++---++--++-+----+--+-++-++----+---+---++-++----++--+++-++--+++---++++-++--++--++-+++-+--++++-++/| |  |||| ||| | |
    |||||| |  |/++-+++-++-+-+---+-++---++--++-+----+--+-++-++----+---+---++-++----++--+++-++\\ |||   |||| ||  ||  || ||| |  |||| || | |  |||| ||| | |
    |||||| |  |||| ||| || | |   | |\\---++--++-+----+--+-++-++----+---+---++-++----++--+++-+/| |||   |||| ||  ||  || ||| |  |||| || | |  |||| ||| | |
    |||||| |  |||| ||| || | |   | |    ||  \\+-+----+--+-++-++----+---+---++-++----++--+++-+-+-+++---++++-++--++--++-+++-+--++++-+/ | |  |||| ||| | |
    |||||| |  |||| ||| || | |   | |    ||/--+-+----+--+-++-++---\\|   |   || ||    ||  ||| | | |||   |||| ||  ||  || ||| |  |||| |  | |  |||| ||| | |
    |||||| |  |||| ||| || | |   | |    |||  | |    |  | || ||   ||   |   || ||    ||  ||| | | ||\\---++++-++--++--++-+++-+--++++-+--+-+--/||| ||| | |
    |||||| |  |||| ||| |^ | |   | |    |||  | |    |  | || ||   ||   |   || ||    ||  |||/+-+-++----++++-++--++--++-+++\\|  |||| |  | |   ||| ||| | |
  /-++++++-+--++++\\||| || | |   | |    |||  | |    |  | || ||   ||   |   \\+-++----++-<++/|| | ||    |||| ||  ||  || |||||  |||| |  | |   ||| ||| | |
  | |||||| \\--++++++++-++-/ |   | |    ||| /+-+----+--+-++-++---++---+---\\| || /--++--++-++-+-++----++++-++--++--++-+++++--++++-+--+\\|   ||| ||| | |
  | ||||||    |||||||| ||   |   | |    ||| || |    |  | || ||   ||   |   || || |  ||  || || | \\+----++++-++--++--++-++/||  |||| |  |||   ||| ||| | |
  | ||||||    |||||||| ||   |   | | /--+++-++-+----+--+-++-++---++---+\\  || || |  \\+--++-++-+--+----++++-++--++--++-++-++--++++-+--+++---+++-+/| | |
  | ||||||    |||||||| ||   |   | | |  ||| || |    | /+-++-++---++---++--++-++-+---+--++-++-+--+----++++-++--++--++-++-++--++++-+--+++---+++-+-+-+-+\\
  | ||||||    |||||||| ||   |   | | |  ||| || |    | || \\+-++---++---++--++-++-+---+--++-++-+--+----++++-++--++--++-++-++--++++-+--+++---+++-+-/ | ||
  | ||||||    \\+++++++-++---+---+-+-+--+++-++-+----+-++--+-++---++---++--++-++-+---+--++-++-+--+----+/|| ||  ||  || || ||  |||| |  |||   ||| |   | ||
  | ||||||     ||||||| ||   |   | | |  ||| || |    | ||  | ||   ||   ||  || || |   |  || || |  |    | || ||  ||  || || ||  |||| |  |||   ||| |   | ||
  | ||||||     ||||||| ||   |   | | |  \\++-++-+----+-++--+-++---++---++--++-++-+---+--++-++-+--+----+-++-++--++--++-++-++--++++-+--+++---+++-+---/ ||
  | \\+++++-----+++++++-+/   |   \\-+-+---++-++-/    | ||  | ||   ||   ||  || || |   \\--++-++-+--+----+-++-++--++--/| || ||  |\\++-+--++/   ||| |     ||
  |  |v|||/----+++++++-+----+--\\  | |   || ||      \\-++--+-++---++---++--++-++-+------++-++-+--+----+-++-++--++---+-++-++--+-++-+--/|    ||| |     ||
  |  ||||||    \\++++++-+----+--+--+-+---++-++--------++--+-++---++---++--++-++-+------++-++-/  |    | || ||  ||   | || ||  | || |   |    ||| |     ||
  |  ||||||   /-++++++-+----+--+--+-+---++-++--------++--+-++---++---++--++-++-+------++-++----+----+-++\\||  ||   | || ||  | || |   |    ||| |     ||
  |  ||||||   | |||||| |    |  |  | |   \\+-++--------++--+-++---++---++--++-++-+------++-++----+----+-+++++--+/   | || ||  | || |   |    ||| |     ||
  |  ||||||   | |||||| \\----+--+--+-+----+-++--------++--+-++---++---++--++-++-+------++-++----+----+-+++++--+----+-+/ ||  | || |   |    ||| |     ||
  \\--++++++---+-++/|||      |  |  | |    | ||        ||  | ||   ||   ||  || || |   /--++-++----+----+-+++++--+----+-+--++\\ | || |   |    ||| |     ||
     ||||||   | || |||      |  |  | |    | \\+--------++--+-++---++---++--/| || |   |  || ||    |    | |||||  |    | |  ||| | || |   |    ||| |     ||
     \\+++++---+-++-+++------+--+--+-+----+--+--------++--+-++---++---++---+-+/ \\---+--++-++----+----+-+++++--+----+-+--+++-+-++-+---/    ||| |     ||
      ||||| /-+-++-+++------+--+--+-+----+--+--------++--+-++---++---++---+-+------+--++-++----+----+-+++++--+\\   | |  ||| \\-++-+--------/|| |     ||
      ||||| | | || |||      \\--+--+-+----+--+--------++--+-++---++---++---+-+->----+--++-++----+----+-++++/  ||   | |  |||   || |         || |     ||
      ||||| | | || |||         |  | |    |  |        |\\--+-++---+/   ||/--+-+------+--++-++----+---\\| |\\++---++---+-/  |||   || |         || |     ||
 /----+++++-+-+-++\\|||         |  | |    \\--+--------+---+-++---/    |||  | |      |  || ||    |   || | |\\---++---+----+++---++-+---------++-+-----/|
 |    ||||| | | ||||||         |  | |       |        |   | ||        |||  | |      |  || ||    |   || | |    ||   |    |||   || |         || |      |
 |    ||||| | | |\\++++---------+--+-+-------+--------+---/ ||        |||  | |      |  || ||    |   || | |    ||   |    |||   || |         || |      |
 |    ||||| | | | ||||         |  | |       |        |     ||   /----+++--+-+------+--++-++----+---++-+-+----++---+----+++---++-+------\\  || |      |
 |    ||||| | | | ||||         |  | |       |        \\-----++---+----+++--+-+------+--++-++----+---++-+-+----++---+----+++---++-+------+--++-+------/
 |    ||||| | | | ||||         |  | \\-------+--------------++---+----+/|  | |      |  || ||    |   || | |    ||   |    ||| /-++-+------+-\\|| |
 |    ||||| | | | ||||         |  |         |              \\+---+----+-+--+-+------+--++-++----+---++-+-+----++---+----+++-+-+/ |      | ||| |
 |    ||||| | \\-+-++++---------+--+---------+---------------+---+----+-+--+-+------+--++-++----+---++-+-/    ||   |    ||| | |  |      | ||| |
 |    ||||| |   | |||\\---------+--+---------+---------------+---+----+-+--+-+------+--++-++----+---++-+------/|   |    ||| | |  |      | ||| |
 |/---+++++-+---+-+++-\\        |  |     /---+---------------+---+----+-+--+-+------+--++-++----+---++-+-------+---+----+++-+-+--+------+\\||| |
 \\+---+++++-+---+-/|| |        |  |     |   |               |/--+----+-+--+-+------+--++-++----+---++-+-----\\ |   |    ||| | |  |      ||||| |
  |   \\++++-+---+--++-+--------+--+-----+---+---------------++--+----+-+--+-+------+--+/ ||    |   || |     | |   |    ||| | |  \\------++++/ |
  |    |||| |   |  || |        |  |     |   |               ||  |    | |  \\-+------+--+--++----/   || |     | |   |    ||| | |         ||||  |
  |    |||| |   |  || |        |  |     v   |               ||  |    | |    |      |  |  \\+--------++-+-----+-+---+----/|| | |         ||||  |
  |    ||\\+-+---+--++-+--------+--/     |   |               ||  |    | |    |      |  |   |        |\\-+-----+-+---/     || | |         ||||  |
  |    || | |   |  \\+-+--------+--------+---+---------------++--+----+-+----+------+--+---+--------+--+----<+-+---------++-+-/         ||||  |
  |    || | |   |   \\-+--------+--------+---+---------------++--+----+-+----+------+--/   |        |  |     | |         || \\-----------++/|  |
  |    \\+-+-+---+-----+--------+--------+---+---------------++--+----+-+----+------+------/        |  |     | |         ||             || |  |
  |     | | |   |     |        |        \\---+---------------++--+----+-+----+------+---------------+--+-----+-+---------++-------------+/ |  |
  |     | | |   |     |        |            |               ||  |    | |    |      |               |  |     | |         ||             |  |  |
  |     | | \\---+-----+--------+------------+---------------++--+----+-+----+------+---------------+--+-----+-/         ||             |  |  |
  |     | |     \\-----+--------+------------+---------------++--+----+-+----/      |               |  |     |           ||             |  |  |
  |     | |           |        |            |    /----------++--+----+-+-----------+---------------+--+-----+-----------++----\\        |  |  |
  |     | |           |        |            |    |          \\+--+----+-+-----------+---------------+--+-----+-----------/|    |        |  |  |
  \\-----+-+-----------/        |            |    |           \\--+----+-+-----------+---------------+--+-----/            |    |        |  |  |
        | |                    |            \\----+--------------+----+-+-----------+---------------+--+------------------+----+--------+--/  |
        | |                    |                 |              |    | |           \\---------------+--+------------------/    |        |     |
        \\-+--------------------+-----------------+--------------+----/ |                           |  |                       |        |     |
          |                    |                 |              |      \\---------------------------/  |                       |        |     |
          \\--------------------/                 |              \\-------------------------------------+-----------------------+--------/     |
                                                 |                                                    \\-----------------------+--------------/
                                                 \\----------------------------------------------------------------------------/")

(defun read-map (stream)
  (loop for line = (read-line stream nil) and y from 0
        for grid = (make-array (list (length line) 1) :adjustable t :element-type 'symbol :initial-element nil)
          then (adjust-array grid
                             (list (max (length line) (array-dimension grid 0))
                                   (1+ (array-dimension grid 1)))
                             :element-type 'symbol
                             :initial-element nil)
        with carts
        while line
        do (loop for char across line
                 for x from 0
                 do (setf (aref grid x y)
                          (cond
                            ((char= char #\/) '/)
                            ((char= char #\\ ) '\\ )
                            ((char= char #\-) '-)
                            ((char= char #\|) '\|)
                            ((char= char #\+) '+)
                            ((char= char #\space) nil)
                            ((char= char #\^) (push (list '^ x y 'left) carts) '\|)
                            ((char= char #\v) (push (list 'v x y 'left) carts) '\|)
                            ((char= char #\<) (push (list '< x y 'left) carts) '\-)
                            ((char= char #\>) (push (list '> x y 'left) carts) '\-)
                            (t (error "Unknown character ~a." char)))))
        finally (return (cons grid carts))))

(defun print-map (map)
  (let* ((grid (car map))
         (carts (cdr map))
         (array (make-array (array-dimensions grid :element-type 'character :initial-element #\.))))
    (loop for y from 0 below (array-dimension grid 1)
          do (loop for x from 0 below (array-dimension grid 0)
                   do (setf (aref array x y) ())))))

(defun next (direction x y)
  (ecase direction
    (^ (list x (1- y)))
    (v (list x (1+ y)))
    (< (list (1- x) y))
    (> (list (1+ x) y))))

(defvar *turns* (make-hash-table :test 'equal))

;; FIXME: there’s probably a clever, fast way based on degrees or
;; integers or somesuch to do this, but … hash tables work
(loop for (key value) in '(((^ left) (< straight))
                           ((v left) (> straight))
                           ((< left) (v straight))
                           ((> left) (^ straight))

                           ((^ straight) (^ right))
                           ((v straight) (V right))
                           ((< straight) (< right))
                           ((> straight) (> right))

                           ((^ right) (> left))
                           ((v right) (< left))
                           ((< right) (^ left))
                           ((> right) (v left)))
      do (setf (gethash key *turns*) value))

(define-condition cart-crash (error)
  ((carts :initarg :carts)))

(defun tick (map)
  (let* ((grid (car map))
         (carts (sort (cdr map) (lambda (x y) (< (array-row-major-index grid (second x) (third x))
                                                 (array-row-major-index grid (second y) (third y)))))))
    (loop for cart in carts
          for next = (next (first cart) (second cart) (third cart))
          do (loop for other-cart in (remove cart carts)
                   when (and (= (second cart) (second other-cart))
                             (= (third cart) (third other-cart)))
                     do (restart-case (error 'cart-crash :carts (list cart other-cart))
                          (remove-carts ()
                            (setf carts (remove-if (lambda (x) (or (eq x cart) (eq x other-cart))) carts)))))
          do (ecase (apply #'aref grid next)
               ((- \|) nil)
               (/ (setf (first cart)
                        (ecase (first cart)
                          (^ '>)
                          (v '<)
                          (< 'v)
                          (> '^))))
               (\\ (setf (first cart)
                         (ecase (first cart)
                           (^ '<)
                           (v '>)
                           (< '^)
                           (> 'v))))
               (+ (destructuring-bind (direction turn)
                      (gethash (list (first cart) (fourth cart)) *turns*)
                      (setf (first cart) direction
                            (fourth cart) turn))))
          do (setf (second cart) (first next)
                   (third cart) (second next)))
    (cons grid carts)))

(defun solution-1 ()
  (with-input-from-string (s *input*)
    (handler-bind ((cart-crash (lambda (c)
                                 (return-from solution-1
                                   (let ((cart (first (slot-value c 'carts))))
                                     (format nil "~a,~a" (second cart) (third cart)))))))
      (loop for map = (read-map s) then (tick map)
            for i from 1 to 2000))))

(defun solution-2 ()
  (with-input-from-string (s *input*)
    (handler-bind ((cart-crash (lambda (c)
                                 (declare (ignore c))
                                 (invoke-restart 'remove-carts))))
      (loop for map = (read-map s) then (tick map)
            for i from 1 to 20000
            while (> (length (cdr map)) 1)
            finally (return (let ((cart (first (cdr map))))
                              (format nil "~a,~a" (second cart) (third cart))))))))