-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path21-01.py
128 lines (127 loc) · 5.37 KB
/
21-01.py
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
from functools import cache
inputval = ""
posi = [
["7", "8", "9"],
["4", "5", "6"],
["1", "2", "3"],
[None, "0", "A"],
]
arr_pads = [
[None, "^", "A"],
["<", "v", ">"]
]
def get_pos(arr, code):
for i, row in enumerate(arr):
if code in row:
return (i, row.index(code))
@cache
def shortest(start, end, layers):
if start == "<" and end == ">":
pass
if isinstance(start, str):
start = get_pos(arr_pads, start)
if isinstance(end, str):
end = get_pos(arr_pads, end)
if layers == 0:
return 1
elif layers < 3:
vert = None
hori = None
if end[0] < start[0]:
vert = "^"
elif end[0] > start[0]:
vert = "v"
if end[1] < start[1]:
hori = "<"
elif end[1] > start[1]:
hori = ">"
if not hori and not vert:
return shortest("A", "A", layers - 1)
elif not hori:
return shortest("A", vert, layers - 1) + (abs(end[0] - start[0]) - 1) * shortest(vert, vert, layers - 1) + shortest(vert, "A", layers - 1)
elif not vert:
return shortest("A", hori, layers - 1) + (abs(end[1] - start[1]) - 1) * shortest(hori, hori, layers - 1) + shortest(hori, "A", layers - 1)
else:
if start[1] == 0:
return shortest("A", hori, layers - 1) + \
(abs(end[1] - start[1]) - 1) * shortest(hori, hori, layers - 1) + \
shortest(hori, vert, layers - 1) + \
(abs(end[0] - start[0]) - 1) * shortest(vert, vert, layers - 1) + \
shortest(vert, "A", layers - 1)
elif end[1] == 0:
return shortest("A", vert, layers - 1) + \
(abs(end[0] - start[0]) - 1) * shortest(vert, vert, layers - 1) + \
shortest(vert, hori, layers - 1) + \
(abs(end[1] - start[1]) - 1) * shortest(hori, hori, layers - 1) + \
shortest(hori, "A", layers - 1)
else:
return min(
shortest("A", hori, layers - 1) + \
(abs(end[1] - start[1]) - 1) * shortest(hori, hori, layers - 1) + \
shortest(hori, vert, layers - 1) + \
(abs(end[0] - start[0]) - 1) * shortest(vert, vert, layers - 1) + \
shortest(vert, "A", layers - 1),
shortest("A", vert, layers - 1) + \
(abs(end[0] - start[0]) - 1) * shortest(vert, vert, layers - 1) + \
shortest(vert, hori, layers - 1) + \
(abs(end[1] - start[1]) - 1) * shortest(hori, hori, layers - 1) + \
shortest(hori, "A", layers - 1)
)
else:
vert = None
hori = None
if end[0] < start[0]:
vert = "^"
elif end[0] > start[0]:
vert = "v"
if end[1] < start[1]:
hori = "<"
elif end[1] > start[1]:
hori = ">"
if not hori and not vert:
return shortest("A", "A", layers - 1)
elif not hori:
return shortest("A", vert, layers - 1) + (abs(end[0] - start[0]) - 1) * shortest(vert, vert, layers - 1) + shortest(vert, "A", layers - 1)
elif not vert:
return shortest("A", hori, layers - 1) + (abs(end[1] - start[1]) - 1) * shortest(hori, hori, layers - 1) + shortest(hori, "A", layers - 1)
else:
if start[1] == 0 and end[0] == 3:
return shortest("A", hori, layers - 1) + \
(abs(end[1] - start[1]) - 1) * shortest(hori, hori, layers - 1) + \
shortest(hori, vert, layers - 1) + \
(abs(end[0] - start[0]) - 1) * shortest(vert, vert, layers - 1) + \
shortest(vert, "A", layers - 1)
elif end[1] == 0 and start[0] == 3:
return shortest("A", vert, layers - 1) + \
(abs(end[0] - start[0]) - 1) * shortest(vert, vert, layers - 1) + \
shortest(vert, hori, layers - 1) + \
(abs(end[1] - start[1]) - 1) * shortest(hori, hori, layers - 1) + \
shortest(hori, "A", layers - 1)
else:
return min(
shortest("A", hori, layers - 1) + \
(abs(end[1] - start[1]) - 1) * shortest(hori, hori, layers - 1) + \
shortest(hori, vert, layers - 1) + \
(abs(end[0] - start[0]) - 1) * shortest(vert, vert, layers - 1) + \
shortest(vert, "A", layers - 1),
shortest("A", vert, layers - 1) + \
(abs(end[0] - start[0]) - 1) * shortest(vert, vert, layers - 1) + \
shortest(vert, hori, layers - 1) + \
(abs(end[1] - start[1]) - 1) * shortest(hori, hori, layers - 1) + \
shortest(hori, "A", layers - 1)
)
for start in ["<", "^", ">", "v", "A"]:
for end in ["<", "^", ">", "v", "A"]:
print(start, end, shortest(start, end, 1))
score = 0
while True:
inputval = input()
if not inputval:
break
intval = int(inputval[:3])
total = 0
for startp, endp in zip("A" + inputval[:3], inputval):
total += shortest(get_pos(posi, startp), get_pos(posi, endp), 3)
print(intval, total)
score += intval * total
print(score)