72 lines
2.2 KiB
Python
72 lines
2.2 KiB
Python
|
|
from output import DD, ints
|
||
|
|
|
||
|
|
|
||
|
|
def solve(data):
|
||
|
|
p12 = []
|
||
|
|
for sl in [2, 10]:
|
||
|
|
seen = set([(0, 0)])
|
||
|
|
snake = [(0, 0)] * sl
|
||
|
|
for line in data.splitlines():
|
||
|
|
d = line[0]
|
||
|
|
for i in range(ints(line)[0]):
|
||
|
|
ns = []
|
||
|
|
hd, *tls = snake
|
||
|
|
r, c = hd
|
||
|
|
hd = r + DD[d][0], c + DD[d][1]
|
||
|
|
ns.append(hd)
|
||
|
|
for tl in tls:
|
||
|
|
r, c = tl
|
||
|
|
match (r - hd[0], c - hd[1]):
|
||
|
|
case (2, -1):
|
||
|
|
tl = r - 1, c + 1
|
||
|
|
case (-2, -1):
|
||
|
|
tl = r + 1, c + 1
|
||
|
|
case (-2, 1):
|
||
|
|
tl = r + 1, c - 1
|
||
|
|
case (2, 1):
|
||
|
|
tl = r - 1, c - 1
|
||
|
|
case (1, 2):
|
||
|
|
tl = r - 1, c - 1
|
||
|
|
case (-1, 2):
|
||
|
|
tl = r + 1, c - 1
|
||
|
|
case (-1, -2):
|
||
|
|
tl = r + 1, c + 1
|
||
|
|
case (1, -2):
|
||
|
|
tl = r - 1, c + 1
|
||
|
|
case (0, 2):
|
||
|
|
tl = r, c - 1
|
||
|
|
case (0, -2):
|
||
|
|
tl = r, c + 1
|
||
|
|
case (2, 0):
|
||
|
|
tl = r - 1, c
|
||
|
|
case (-2, 0):
|
||
|
|
tl = r + 1, c
|
||
|
|
case (2, -2):
|
||
|
|
tl = r - 1, c + 1
|
||
|
|
case (-2, -2):
|
||
|
|
tl = r + 1, c + 1
|
||
|
|
case (-2, 2):
|
||
|
|
tl = r + 1, c - 1
|
||
|
|
case (2, 2):
|
||
|
|
tl = r - 1, c - 1
|
||
|
|
ns.append(tl)
|
||
|
|
hd = tl
|
||
|
|
snake = ns
|
||
|
|
seen.add(tl)
|
||
|
|
p12.append(len(seen))
|
||
|
|
p1, p2 = p12
|
||
|
|
return p1, p2
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
with open("./input/09.txt", "r") as f:
|
||
|
|
inp = f.read().strip()
|
||
|
|
|
||
|
|
p1, p2 = solve(inp)
|
||
|
|
|
||
|
|
print(p1)
|
||
|
|
print(p2)
|
||
|
|
|
||
|
|
assert p1 == 6212
|
||
|
|
assert p2 == 2522
|