diff --git a/day-21/day-21.py b/day-21/day-21.py new file mode 100644 index 0000000..f343a24 --- /dev/null +++ b/day-21/day-21.py @@ -0,0 +1,62 @@ +#!/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) diff --git a/day-21/input.txt b/day-21/input.txt new file mode 100644 index 0000000..a2384a3 --- /dev/null +++ b/day-21/input.txt @@ -0,0 +1,2 @@ +Player 1 starting position: 4 +Player 2 starting position: 10 \ No newline at end of file