Solve day 15 (part 2 bruteforce)

This commit is contained in:
Gabriel Augendre 2020-12-15 09:22:49 +01:00
parent cd02ef3595
commit 3fe94bbb02
No known key found for this signature in database
GPG key ID: 1E693F4CE4AEE7B4
7 changed files with 109 additions and 0 deletions

70
2020/day15_memory.py Normal file
View file

@ -0,0 +1,70 @@
import functools
import re
from typing import Dict, Iterable, List, Tuple, Union
def main(filename: str, expected_part_1: int = None, expected_part_2: int = None):
print(f"\n+ Running on {filename}")
with open(filename) as f:
starting_numbers = list(map(int, f.read().strip().split("\n")[0].split(",")))
counter_part_1 = solve_part_1(starting_numbers)
print(f"1. Found {counter_part_1}")
if expected_part_1:
assert expected_part_1 == counter_part_1
counter_part_2 = solve_part_2(starting_numbers)
print(f"2. Found {counter_part_2}")
if expected_part_2:
assert expected_part_2 == counter_part_2
SeenTuple = Union[Tuple[int], Tuple[int, int]]
Seen = Dict[int, SeenTuple]
def solve_part_1(starting_numbers):
return solve(starting_numbers, 2020)
def solve(starting_numbers, limit):
seen = dict() # type: Seen
previous = 0
for turn, current in enumerate(starting_numbers):
seen[current] = (turn,)
previous = current
previous_first_time = True
for turn in range(len(starting_numbers), limit):
if previous_first_time:
current = 0
else:
current = seen[previous][0] - seen[previous][1]
seen[current] = seen_tuple(seen, current, turn)
previous = current
previous_first_time = first_time_seen(seen, previous)
return previous
def first_time_seen(seen: Seen, previous: int) -> bool:
return len(seen[previous]) == 1
def seen_tuple(seen: Seen, current: int, turn: int) -> SeenTuple:
try:
existing = seen[current]
return turn, existing[0]
except KeyError:
return (turn,)
def solve_part_2(starting_numbers):
return solve(starting_numbers, 30_000_000)
if __name__ == "__main__":
main("inputs/day15-test1", 436, 175594)
main("inputs/day15-test2", 1, 2578)
main("inputs/day15-test6", 438, 18)
main("inputs/day15-test7", 1836, 362)
main("inputs/day15", 595, 1708310)

1
2020/inputs/day15 Normal file
View file

@ -0,0 +1 @@
1,17,0,10,18,11,6

1
2020/inputs/day15-test1 Normal file
View file

@ -0,0 +1 @@
0,3,6

1
2020/inputs/day15-test2 Normal file
View file

@ -0,0 +1 @@
1,3,2

1
2020/inputs/day15-test6 Normal file
View file

@ -0,0 +1 @@
3,2,1

1
2020/inputs/day15-test7 Normal file
View file

@ -0,0 +1 @@
3,1,2

34
2020/template.py Normal file
View file

@ -0,0 +1,34 @@
import functools
import re
from typing import Dict, Iterable, List, Union
def main(filename: str, expected_part_1: int = None, expected_part_2: int = None):
print(f"\n+ Running on {filename}")
with open(filename) as f:
data = f.read().strip().split("\n")
counter_part_1 = solve_part_1(data)
print(f"1. Found {counter_part_1}")
if expected_part_1:
assert expected_part_1 == counter_part_1
counter_part_2 = solve_part_2(data)
print(f"2. Found {counter_part_2}")
if expected_part_2:
assert expected_part_2 == counter_part_2
def solve_part_1(data):
return 0
def solve_part_2(data):
return 0
if __name__ == "__main__":
main("inputs/day14-test1", 436)
main("inputs/day14-test2", 1)
main("inputs/day14")