Update day22.py
This commit is contained in:
parent
a6aac6a548
commit
bbcc9e1bb3
|
@ -39,3 +39,61 @@ def solve_p1(player1: list[int], player2: list[int]) -> int:
|
||||||
|
|
||||||
PLAYER1, PLAYER2 = parse_data()
|
PLAYER1, PLAYER2 = parse_data()
|
||||||
print(solve_p1(PLAYER1, PLAYER2))
|
print(solve_p1(PLAYER1, PLAYER2))
|
||||||
|
|
||||||
|
|
||||||
|
def play_game(cache: dict[str, int], player1: list[int], player2: list[int]) -> (int, list[int]):
|
||||||
|
previous_rounds: set[str] = set()
|
||||||
|
stack1, stack2 = list(reversed(player1)), list(reversed(player2))
|
||||||
|
|
||||||
|
def round_snapshot() -> str:
|
||||||
|
return f"{stack1}|{stack2}"
|
||||||
|
|
||||||
|
def normal_round() -> None:
|
||||||
|
_number1, _number2 = stack1.pop(), stack2.pop()
|
||||||
|
if _number1 > _number2:
|
||||||
|
stack1.insert(0, _number1)
|
||||||
|
stack1.insert(0, _number2)
|
||||||
|
else:
|
||||||
|
stack2.insert(0, _number2)
|
||||||
|
stack2.insert(0, _number1)
|
||||||
|
|
||||||
|
while len(stack1) > 0 and len(stack2) > 0:
|
||||||
|
if (snapshot := round_snapshot()) in previous_rounds:
|
||||||
|
return 1, stack1
|
||||||
|
else:
|
||||||
|
previous_rounds.add(snapshot)
|
||||||
|
|
||||||
|
if len(stack1) > stack1[len(stack1)-1] and len(stack2) > stack2[len(stack2)-1]:
|
||||||
|
number1, number2 = stack1.pop(), stack2.pop()
|
||||||
|
sub_deck1, sub_deck2 = stack1[1-number1:], stack2[1-number2:]
|
||||||
|
|
||||||
|
# Check cache for winner
|
||||||
|
if (sub_snapshot := f"{sub_deck1}|{sub_deck2}") not in cache:
|
||||||
|
winner, _ = play_game(cache, sub_deck1, sub_deck2)
|
||||||
|
cache[sub_snapshot] = winner
|
||||||
|
else:
|
||||||
|
winner = cache[sub_snapshot]
|
||||||
|
|
||||||
|
if winner == 1:
|
||||||
|
stack1.insert(0, number1)
|
||||||
|
stack1.insert(0, number2)
|
||||||
|
else:
|
||||||
|
stack2.insert(0, number2)
|
||||||
|
stack2.insert(0, number1)
|
||||||
|
else:
|
||||||
|
normal_round()
|
||||||
|
|
||||||
|
if len(stack1) > 0:
|
||||||
|
return 1, stack1
|
||||||
|
else:
|
||||||
|
return 2, stack2
|
||||||
|
|
||||||
|
|
||||||
|
# PART 2 is Broken for now
|
||||||
|
def solve_p2(player1: list[int], player2: list[int]) -> int:
|
||||||
|
cache: dict[str, int] = {}
|
||||||
|
winner, winning = play_game(cache, player1, player2)
|
||||||
|
return sum(x*y for (x, y) in (zip(winning, [x for x in range(1, len(winning)+1)])))
|
||||||
|
|
||||||
|
|
||||||
|
print(solve_p2(PLAYER1, PLAYER2))
|
||||||
|
|
Loading…
Reference in a new issue