@@ -16,40 +16,28 @@ def path_to(start, end, numpad):
16
16
dy = ey - sy
17
17
spacex , spacey = pad [" " ]
18
18
ri = up = ""
19
+ yy = ("^" if dy < 0 else "v" ) * abs (dy )
20
+ xx = ("<" if dx < 0 else ">" ) * abs (dx )
19
21
if not (sx == spacex and sy + dy == spacey ):
20
- up += ("^" if dy < 0 else "v" ) * abs (dy )
21
- up += ("<" if dx < 0 else ">" ) * abs (dx )
22
-
22
+ s = up = yy + xx
23
23
if not (sx + dx == spacex and sy == spacey ):
24
- ri += ("<" if dx < 0 else ">" ) * abs (dx )
25
- ri += ("^" if dy < 0 else "v" ) * abs (dy )
24
+ s = ri = xx + yy
26
25
27
26
if up and ri :
28
27
s = up if random () < 0.5 else ri
29
- else :
30
- s = up or ri
31
28
return s + "A"
32
29
33
-
34
30
@cache
35
- def length (P , char , i ):
36
- if i == 0 : return 1
37
- s = 0
38
- prev = 'A'
39
- for c in path_to (P , char , i == G ):
40
- s += length (prev , c , i - 1 )
41
- prev = c
31
+ def length (code , robot , s = 0 ):
32
+ if robot == 0 : return len (code )
33
+ for i , c in enumerate (code ):
34
+ s += length (path_to (code [i - 1 ], c , robot == G ), robot - 1 )
42
35
return s
43
36
44
37
def solve (code ):
45
38
path_to .cache_clear ()
46
39
length .cache_clear ()
47
- prev = 'A'
48
- s = 0
49
- for c in code :
50
- s += length (prev , c , G )
51
- prev = c
52
- return int (code [:- 1 ]) * s
40
+ return int (code [:- 1 ]) * length (code , G )
53
41
54
42
def simulate (code ):
55
43
return min (solve (code ) for _ in range (1000 ))
0 commit comments