@@ -52,7 +52,24 @@ extension (ptype: PadType) {
52
52
while ! queue.isEmpty do
53
53
val node = queue.dequeue()
54
54
if node.pos == endPos then
55
- return node.program.appended('A' )
55
+ // Annoying edge cases, what rule do they follow?
56
+ return Map (
57
+ (" >>^" , " ^>>" ),
58
+ (" vv<" , " <vv" ),
59
+ (" vv>v" , " >vvv" ),
60
+ (" >>v" , " v>>" ),
61
+ (" vvv<" , " <vvv" ),
62
+ (" vv<" , " <vv" ),
63
+ (" <^<" , " ^<<" ),
64
+ (" ^^<" , " <^^" ),
65
+ (" ^^^<" , " <^^^" ),
66
+ (" <v<" , " v<<" ),
67
+ (" <^^" , " ^<^" ),
68
+ (" <^^^" , " ^^^<" ),
69
+ (" v>>" , " >>v" ),
70
+ (" ^>>" , " >>^" ),
71
+ ).getOrElse(node.program, node.program)
72
+ .appended('A' )
56
73
57
74
for action <- List ('<' , '^' , 'v' , '>' ) do
58
75
val dir = DIRECTIONS (action)
@@ -201,6 +218,139 @@ def solve(robots: Int, goals: List[String], func: (Int, String) => Int): Int =
201
218
202
219
val SHORTEST_PATHS = PadType .Num .shortestPaths ++ PadType .Dir .shortestPaths
203
220
221
+ val SHORTEST_PATHS_2 = Map (
222
+ (('A' , '0' ), " <A" ),
223
+ (('0' , 'A' ), " >A" ),
224
+ (('A' , '1' ), " ^<<A" ),
225
+ (('1' , 'A' ), " >>vA" ),
226
+ (('A' , '2' ), " <^A" ),
227
+ (('2' , 'A' ), " v>A" ),
228
+ (('A' , '3' ), " ^A" ),
229
+ (('3' , 'A' ), " vA" ),
230
+ (('A' , '4' ), " ^^<<A" ),
231
+ (('4' , 'A' ), " >>vvA" ),
232
+ (('A' , '5' ), " <^^A" ),
233
+ (('5' , 'A' ), " vv>A" ),
234
+ (('A' , '6' ), " ^^A" ),
235
+ (('6' , 'A' ), " vvA" ),
236
+ (('A' , '7' ), " ^^^<<A" ),
237
+ (('7' , 'A' ), " >>vvvA" ),
238
+ (('A' , '8' ), " <^^^A" ),
239
+ (('8' , 'A' ), " vvv>A" ),
240
+ (('A' , '9' ), " ^^^A" ),
241
+ (('9' , 'A' ), " vvvA" ),
242
+ (('0' , '1' ), " ^<A" ),
243
+ (('1' , '0' ), " >vA" ),
244
+ (('0' , '2' ), " ^A" ),
245
+ (('2' , '0' ), " vA" ),
246
+ (('0' , '3' ), " ^>A" ),
247
+ (('3' , '0' ), " <vA" ),
248
+ (('0' , '4' ), " ^<^A" ),
249
+ (('4' , '0' ), " >vvA" ),
250
+ (('0' , '5' ), " ^^A" ),
251
+ (('5' , '0' ), " vvA" ),
252
+ (('0' , '6' ), " ^^>A" ),
253
+ (('6' , '0' ), " <vvA" ),
254
+ (('0' , '7' ), " ^^^<A" ),
255
+ (('7' , '0' ), " >vvvA" ),
256
+ (('0' , '8' ), " ^^^A" ),
257
+ (('8' , '0' ), " vvvA" ),
258
+ (('0' , '9' ), " ^^^>A" ),
259
+ (('9' , '0' ), " <vvvA" ),
260
+ (('1' , '2' ), " >A" ),
261
+ (('2' , '1' ), " <A" ),
262
+ (('1' , '3' ), " >>A" ),
263
+ (('3' , '1' ), " <<A" ),
264
+ (('1' , '4' ), " ^A" ),
265
+ (('4' , '1' ), " vA" ),
266
+ (('1' , '5' ), " ^>A" ),
267
+ (('5' , '1' ), " <vA" ),
268
+ (('1' , '6' ), " ^>>A" ),
269
+ (('6' , '1' ), " <<vA" ),
270
+ (('1' , '7' ), " ^^A" ),
271
+ (('7' , '1' ), " vvA" ),
272
+ (('1' , '8' ), " ^^>A" ),
273
+ (('8' , '1' ), " <vvA" ),
274
+ (('1' , '9' ), " ^^>>A" ),
275
+ (('9' , '1' ), " <<vvA" ),
276
+ (('2' , '3' ), " >A" ),
277
+ (('3' , '2' ), " <A" ),
278
+ (('2' , '4' ), " <^A" ),
279
+ (('4' , '2' ), " v>A" ),
280
+ (('2' , '5' ), " ^A" ),
281
+ (('5' , '2' ), " vA" ),
282
+ (('2' , '6' ), " ^>A" ),
283
+ (('6' , '2' ), " <vA" ),
284
+ (('2' , '7' ), " <^^A" ),
285
+ (('7' , '2' ), " vv>A" ),
286
+ (('2' , '8' ), " ^^A" ),
287
+ (('8' , '2' ), " vvA" ),
288
+ (('2' , '9' ), " ^^>A" ),
289
+ (('9' , '2' ), " <vvA" ),
290
+ (('3' , '4' ), " <<^A" ),
291
+ (('4' , '3' ), " v>>A" ),
292
+ (('3' , '5' ), " <^A" ),
293
+ (('5' , '3' ), " v>A" ),
294
+ (('3' , '6' ), " ^A" ),
295
+ (('6' , '3' ), " vA" ),
296
+ (('3' , '7' ), " <<^^A" ),
297
+ (('7' , '3' ), " vv>>A" ),
298
+ (('3' , '8' ), " <^^A" ),
299
+ (('8' , '3' ), " vv>A" ),
300
+ (('3' , '9' ), " ^^A" ),
301
+ (('9' , '3' ), " vvA" ),
302
+ (('4' , '5' ), " >A" ),
303
+ (('5' , '4' ), " <A" ),
304
+ (('4' , '6' ), " >>A" ),
305
+ (('6' , '4' ), " <<A" ),
306
+ (('4' , '7' ), " ^A" ),
307
+ (('7' , '4' ), " vA" ),
308
+ (('4' , '8' ), " ^>A" ),
309
+ (('8' , '4' ), " <vA" ),
310
+ (('4' , '9' ), " ^>>A" ),
311
+ (('9' , '4' ), " <<vA" ),
312
+ (('5' , '6' ), " >A" ),
313
+ (('6' , '5' ), " <A" ),
314
+ (('5' , '7' ), " <^A" ),
315
+ (('7' , '5' ), " v>A" ),
316
+ (('5' , '8' ), " ^A" ),
317
+ (('8' , '5' ), " vA" ),
318
+ (('5' , '9' ), " ^>A" ),
319
+ (('9' , '5' ), " <vA" ),
320
+ (('6' , '7' ), " <<^A" ),
321
+ (('7' , '6' ), " v>>A" ),
322
+ (('6' , '8' ), " <^A" ),
323
+ (('8' , '6' ), " v>A" ),
324
+ (('6' , '9' ), " ^A" ),
325
+ (('9' , '6' ), " vA" ),
326
+ (('7' , '8' ), " >A" ),
327
+ (('8' , '7' ), " <A" ),
328
+ (('7' , '9' ), " >>A" ),
329
+ (('9' , '7' ), " <<A" ),
330
+ (('8' , '9' ), " >A" ),
331
+ (('9' , '8' ), " <A" ),
332
+ (('<' , '^' ), " >^A" ),
333
+ (('^' , '<' ), " v<A" ),
334
+ (('<' , 'v' ), " >A" ),
335
+ (('v' , '<' ), " <A" ),
336
+ (('<' , '>' ), " >>A" ),
337
+ (('>' , '<' ), " <<A" ),
338
+ (('<' , 'A' ), " >>^A" ),
339
+ (('A' , '<' ), " v<<A" ),
340
+ (('^' , 'v' ), " vA" ),
341
+ (('v' , '^' ), " ^A" ),
342
+ (('^' , '>' ), " v>A" ),
343
+ (('>' , '^' ), " <^A" ),
344
+ (('^' , 'A' ), " >A" ),
345
+ (('A' , '^' ), " <A" ),
346
+ (('v' , '>' ), " >A" ),
347
+ (('>' , 'v' ), " <A" ),
348
+ (('v' , 'A' ), " ^>A" ),
349
+ (('A' , 'v' ), " <vA" ),
350
+ (('>' , 'A' ), " ^A" ),
351
+ (('A' , '>' ), " vA" ),
352
+ )
353
+
204
354
def shortestProgramLengthClever (robots : Int , goal : String ): Int =
205
355
// TODO: Memoize
206
356
if robots < 0 then
@@ -224,8 +374,9 @@ def moveCount(robots: Int, current: Char, next: Char): Int =
224
374
// println(s"Part 1: ${solve(2, goals)}")
225
375
// println(s"Part 2: ${solve(25, goals)}")
226
376
227
- for p <- SHORTEST_PATHS .toList.sorted do
228
- println(p)
377
+ for (k, p) <- SHORTEST_PATHS .toList.sorted do
378
+ if k._1 != k._2 && p != SHORTEST_PATHS_2 (k) then
379
+ println(s " ( \" $p\" , \" ${SHORTEST_PATHS_2 (k)}\" ) " )
229
380
230
381
for i <- (0 to 3 ) do
231
382
println(s " ${solve(i, goals, { (r, g) => shortestProgram(r, g).length })} vs ${solve(i, goals, shortestProgramLength)} vs ${solve(i, goals, shortestProgramLengthClever)}" )
0 commit comments