-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathday_22.py
75 lines (59 loc) · 2.43 KB
/
day_22.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/env python3
"""Advent of Code 2020 Day 22 - Crab Combat."""
def play_game(player_1: list, player_2: list, part_two: bool=False) -> tuple:
"""Play a game of (Recursive) Combat returning winner and their hand.
Args:
player_1: List of player one's card values.
player_2: List of player two's card values.
Return:
Tuple of winner's number (1/2) and their winning card values in order.
"""
prev_rounds = set()
while player_1 and player_2:
one_card = player_1[0]
two_card = player_2[0]
if (tuple(player_1), tuple(player_2)) in prev_rounds:
player_1.extend([one_card, two_card])
return (1, player_1)
prev_rounds.add((tuple(player_1), tuple(player_2)))
if not part_two:
if one_card > two_card:
player_1.extend([one_card, two_card])
else:
player_2.extend([two_card, one_card])
else:
if len(player_1) - 1 >= one_card and len(player_2) - 1 >= two_card:
one_recursive = player_1[1: one_card + 1].copy()
two_recursive = player_2[1: two_card + 1].copy()
winner = play_game(one_recursive, two_recursive, True)
if winner[0] == 1:
player_1.extend([one_card, two_card])
else:
player_2.extend([two_card, one_card])
else:
if one_card > two_card:
player_1.extend([one_card, two_card])
else:
player_2.extend([two_card, one_card])
player_1 = player_1[1:]
player_2 = player_2[1:]
if player_1:
return (1, player_1)
else:
return (2, player_2)
with open('inputs/day_22.txt') as f:
player_1, player_2 = [line for line in f.read().split('\n\n')]
player_1 = [int(x) for x in player_1.split('\n')[1:]]
player_2 = [int(x) for x in player_2.split('\n')[1:-1]]
winner, winning_order = play_game(player_1.copy(), player_2.copy())
winning_score = 0
for rev_index, card in enumerate(winning_order[::-1], 1):
winning_score += rev_index * card
# Answer One
print("Combat winner's score:", winning_score)
winner, winning_order = play_game(player_1, player_2, part_two=True)
winning_score = 0
for rev_index, card in enumerate(winning_order[::-1], 1):
winning_score += rev_index * card
# Answer Two
print("Recursive Combat winner's score:", winning_score)