Files
advent-of-code-2021/day-21/day-21.py
Pascal Lais 9576bc490f
All checks were successful
continuous-integration/drone/push Build is passing
Update day 21 solution
2021-12-21 16:30:01 +01:00

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
(w1, w0) = quantum_roll(state, p1, new_p0, s1, new_s0)
res = (res[0] + w0, res[1] + w1)
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)