56 lines
1.7 KiB
Python
56 lines
1.7 KiB
Python
import aoclib
|
|
|
|
DAY = 22
|
|
TEST_SOLUTION_PART1 = 306
|
|
TEST_SOLUTION_PART2 = 291
|
|
|
|
|
|
def play(player1_cards, player2_cards, recursive_combat=False):
|
|
previous_rounds = set()
|
|
while player1_cards and player2_cards:
|
|
if recursive_combat:
|
|
deck_tuple = (tuple(player1_cards), tuple(player2_cards))
|
|
if deck_tuple in previous_rounds:
|
|
return 1, player1_cards
|
|
else:
|
|
previous_rounds.add(deck_tuple)
|
|
|
|
card1 = player1_cards.pop(0)
|
|
card2 = player2_cards.pop(0)
|
|
if not recursive_combat:
|
|
if card1 > card2:
|
|
player1_cards.extend([card1, card2])
|
|
else:
|
|
player2_cards.extend([card2, card1])
|
|
else:
|
|
if len(player1_cards) >= card1 and len(player2_cards) >= card2:
|
|
winner, _ = play(player1_cards.copy()[:card1], player2_cards.copy()[:card2], True)
|
|
else:
|
|
winner = 1 if card1 > card2 else 2
|
|
|
|
if winner == 1:
|
|
player1_cards.extend([card1, card2])
|
|
else:
|
|
player2_cards.extend([card2, card1])
|
|
|
|
winner = (1, player1_cards) if len(player1_cards) else (2, player2_cards)
|
|
return winner
|
|
|
|
|
|
def part1(test_mode=False, recursive_combat=False):
|
|
my_input = aoclib.getMultiLineInputAsArray(day=DAY, test=test_mode)
|
|
|
|
player1 = [int(x) for x in my_input[0][1:]]
|
|
player2 = [int(x) for x in my_input[1][1:]]
|
|
|
|
_, winner = play(player1, player2, recursive_combat)
|
|
answer = 0
|
|
for x, c in enumerate(winner):
|
|
answer += (len(winner) - x) * c
|
|
|
|
return answer
|
|
|
|
|
|
def part2(test_mode=False):
|
|
return part1(test_mode, recursive_combat=True)
|