All checks were successful
continuous-integration/drone/push Build is passing
63 lines
1.5 KiB
Python
63 lines
1.5 KiB
Python
#!/usr/bin/env python3
|
|
from pathlib import Path
|
|
from collections import defaultdict
|
|
|
|
|
|
def quantum_roll(state, p0, p1, s0, s1):
|
|
if s0 >= 21:
|
|
return (1, 0)
|
|
if s1 >= 21:
|
|
return (0, 1)
|
|
if (p0, p1, s0, s1) in state:
|
|
return state[(p0, p1, s0, s1)]
|
|
res = (0, 0)
|
|
for d0 in [1, 2, 3]:
|
|
for d1 in [1, 2, 3]:
|
|
for d2 in [1, 2, 3]:
|
|
new_p0 = (p0 + d0 + d1 + d2) % 10
|
|
new_s0 = s0 + new_p0 + 1
|
|
(x1, y1) = quantum_roll(state, p1, new_p0, s1, new_s0)
|
|
res = (res[0] + y1, res[1] + x1)
|
|
state[(p0, p1, s0, s1)] = res
|
|
return res
|
|
|
|
|
|
def part_1(input):
|
|
result = 0
|
|
pos = []
|
|
pos.append(int(input[0].rstrip().split()[-1]) - 1)
|
|
pos.append(int(input[1].rstrip().split()[-1]) - 1)
|
|
score = [0, 0]
|
|
p = 0
|
|
dice = 1
|
|
while True:
|
|
pos[p] += sum(range(dice, dice + 3))
|
|
pos[p] %= 10
|
|
score[p] += pos[p] + 1
|
|
dice += 3
|
|
if 1000 <= score[p]:
|
|
p += 1
|
|
p %= 2
|
|
break
|
|
p += 1
|
|
p %= 2
|
|
result = score[p] * (dice - 1)
|
|
print("Part 1 result:", result)
|
|
|
|
|
|
def part_2(input):
|
|
result = 0
|
|
state = {}
|
|
p0 = int(input[0].rstrip().split()[-1]) - 1
|
|
p1 = int(input[1].rstrip().split()[-1]) - 1
|
|
result = max(quantum_roll(state, p0, p1, 0, 0))
|
|
print("Part 2 result:", result)
|
|
|
|
|
|
input = list()
|
|
p = Path(__file__).with_name('input.txt')
|
|
with open(p) as f:
|
|
input = f.readlines()
|
|
part_1(input)
|
|
part_2(input)
|