-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday_22.py
92 lines (76 loc) · 1.97 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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
from collections import deque
import aoc_helper
raw = aoc_helper.fetch(22, year=2020)
# print(raw)
# raw = """Player 1:
# 9
# 2
# 6
# 3
# 1
# Player 2:
# 5
# 8
# 4
# 7
# 10"""
raw = """Player 1:
43
19
Player 2:
2
29
14"""
def parse_raw():
p1, p2 = raw.split("\n\n")
return aoc_helper.extract_ints(p1)[1:], aoc_helper.extract_ints(p2)[1:]
p1, p2 = parse_raw()
print(p1, p2)
def part_one():
a, b = deque(p1), deque(p2)
while a and b:
# for i in range(29):
card_a, card_b = a.popleft(), b.popleft()
if card_a > card_b:
a.append(card_a)
a.append(card_b)
else:
b.append(card_b)
b.append(card_a)
# print(i, a, b)
winner = a or b
return sum(i * n for i, n in enumerate(reversed(winner), start=1))
def recursive_combat(deck_1, deck_2, depth=0):
a, b = deque(deck_1), deque(deck_2)
previous_states = []
rounds = 0
while a and b:
# print(depth, rounds, a, b, (a, b) in previous_states)
rounds += 1
if (a, b) in previous_states:
return 1, 0
previous_states.append((a.copy(), b.copy()))
card_a, card_b = a.popleft(), b.popleft()
# print(card_a < len(a), card_b < len(b))
if card_a <= len(a) and card_b <= len(b):
value_a, value_b = recursive_combat(
list(a)[:card_a], list(b)[:card_b], depth + 1
)
else:
value_a = card_a
value_b = card_b
if value_a > value_b:
a.append(card_a)
a.append(card_b)
else:
b.append(card_b)
b.append(card_a)
return sum(i * n for i, n in enumerate(reversed(a), start=1)), sum(
i * n for i, n in enumerate(reversed(b), start=1)
)
def part_two():
a, b = recursive_combat(p1, p2)
return a or b
print(part_two())
aoc_helper.lazy_submit(day=22, year=2020, solution=part_one)
# aoc_helper.lazy_submit(day=22, year=2020, solution=part_two)