-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathday_15.py
68 lines (48 loc) · 1.67 KB
/
day_15.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
#!/bin/env python
""" Advent of Code Day 15 """
from collections import defaultdict, deque
class Day15:
""" Class for processing of day 15 """
def __init__(self):
self.lines = []
self.seen_nums = {}
def load_input(self, file_name):
""" load the input """
with open(file_name, "r") as in_file:
for line in in_file.readlines():
for num in line.rstrip('\n').split(','):
self.lines.append(int(num))
def get_task(self, limit: int):
""" Play the memory numbers game """
self.seen_nums = defaultdict(deque)
turn = 0
num_queue = deque(self.lines)
while turn < len(self.lines):
turn += 1
num = num_queue.popleft()
self.seen_nums[num].append(turn)
turn += 1
self.seen_nums[0].append(turn)
num = 0
while turn < limit:
turn += 1
next_num = 0
if len(self.seen_nums[num]) > 1:
next_num = self.seen_nums[num][1] - self.seen_nums[num][0]
num = next_num
self.seen_nums[next_num].append(turn)
if len(self.seen_nums[next_num]) > 2:
self.seen_nums[next_num].popleft()
print(f"Task: {num}")
return num
def test_app():
""" Run the tests """
runner = Day15()
runner.load_input("input15_test")
assert runner.get_task(limit=10) == 0
assert runner.get_task(limit=30000000) == 175594
if __name__ == "__main__":
day_processor = Day15()
day_processor.load_input("input15")
task1 = day_processor.get_task(limit=2020)
task2 = day_processor.get_task(limit=30000000)