Files
aocpy/2020/d22.py
2024-10-04 18:38:32 -04:00

87 lines
1.6 KiB
Python

from collections import deque, defaultdict
from lib import get_data, ints
data = get_data(__file__)
a, b = data.strip().split("\n\n")
a = deque(ints(a)[1:])
b = deque(ints(b)[1:])
while a and b:
x, y = a.popleft(), b.popleft()
if x > y:
a.append(x)
a.append(y)
elif y > x:
b.append(y)
b.append(x)
else:
assert False
for p in [a, b]:
s = 0
for i, c in enumerate(reversed(p)):
s += (i + 1) * c
if s > 0:
print(s)
CACHE = {}
def play(a, b):
if len(a) == 0 or len(b) == 0:
return a, b
s = (tuple(a), tuple(b))
if s in CACHE:
return CACHE[s]
seen = set()
while a and b:
s = (tuple(a), tuple(b))
if s in seen:
return True, False
seen.add(s)
x, y = a.popleft(), b.popleft()
if x <= len(a) and y <= len(b):
ar, br = play(deque(list(a)[:x]), deque(list(b)[:y]))
if ar:
a.append(x)
a.append(y)
elif br:
b.append(y)
b.append(x)
else:
assert False
else:
if x > y:
a.append(x)
a.append(y)
elif y > x:
b.append(y)
b.append(x)
else:
assert False
s = (tuple(a), tuple(b))
if s not in CACHE:
CACHE[s] = (a, b)
return a, b
a, b = data.strip().split("\n\n")
a = deque(ints(a)[1:])
b = deque(ints(b)[1:])
a, b = play(a, b)
for p in [a, b]:
s = 0
for i, c in enumerate(reversed(p)):
s += (i + 1) * c
if s > 0:
print(s)