Skip to content

Commit 6b75db0

Browse files
committed
Patch some of the wrong orderings
1 parent f963c8c commit 6b75db0

File tree

1 file changed

+154
-3
lines changed

1 file changed

+154
-3
lines changed

day21/src/day21.scala

Lines changed: 154 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,24 @@ extension (ptype: PadType) {
5252
while !queue.isEmpty do
5353
val node = queue.dequeue()
5454
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')
5673

5774
for action <- List('<', '^', 'v', '>') do
5875
val dir = DIRECTIONS(action)
@@ -201,6 +218,139 @@ def solve(robots: Int, goals: List[String], func: (Int, String) => Int): Int =
201218

202219
val SHORTEST_PATHS = PadType.Num.shortestPaths ++ PadType.Dir.shortestPaths
203220

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+
204354
def shortestProgramLengthClever(robots: Int, goal: String): Int =
205355
// TODO: Memoize
206356
if robots < 0 then
@@ -224,8 +374,9 @@ def moveCount(robots: Int, current: Char, next: Char): Int =
224374
// println(s"Part 1: ${solve(2, goals)}")
225375
// println(s"Part 2: ${solve(25, goals)}")
226376

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)}\")")
229380

230381
for i <- (0 to 3) do
231382
println(s"${solve(i, goals, { (r, g) => shortestProgram(r, g).length })} vs ${solve(i, goals, shortestProgramLength)} vs ${solve(i, goals, shortestProgramLengthClever)}")

0 commit comments

Comments
 (0)