Skip to content

Commit b44285a

Browse files
solution: add 2020 day 15
1 parent 700a5ab commit b44285a

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
from typing import List
2+
3+
from adventofcode.util.exceptions import SolutionNotFoundException
4+
from adventofcode.util.helpers import solution_timer
5+
from adventofcode.util.input_helpers import get_input_for_day
6+
7+
8+
def parse_input(input_data: List[str]) -> List[int]:
9+
return list(map(int, input_data[0].split(',')))
10+
11+
12+
def solve(input_data: List[int], rounds: int) -> int:
13+
seen = {value: index + 1 for index, value in enumerate(input_data[:-1])}
14+
number = input_data[-1]
15+
16+
for play_round in range(len(input_data), rounds):
17+
seen[number], number = play_round, 0 if number not in seen else play_round - seen[number]
18+
return number
19+
20+
21+
@solution_timer(2020, 15, 1)
22+
def part_one(input_data: List[str]):
23+
answer = solve(parse_input(input_data), 2020)
24+
25+
if not answer:
26+
raise SolutionNotFoundException(2020, 15, 1)
27+
28+
return answer
29+
30+
31+
@solution_timer(2020, 15, 2)
32+
def part_two(input_data: List[str]):
33+
answer = solve(parse_input(input_data), 30000000)
34+
35+
if not answer:
36+
raise SolutionNotFoundException(2020, 15, 2)
37+
38+
return answer
39+
40+
41+
if __name__ == '__main__':
42+
data = get_input_for_day(2020, 15)
43+
part_one(data)
44+
part_two(data)
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import os
2+
3+
import pytest
4+
5+
from adventofcode.year_2020.day_15_2020 import part_two, part_one, parse_input, solve
6+
7+
test_input = [
8+
'0,3,6',
9+
]
10+
11+
12+
def test_parse_input():
13+
assert parse_input(test_input) == [0, 3, 6]
14+
15+
16+
@pytest.mark.parametrize(['starting_list', 'rounds', 'expected'], [
17+
([0, 3, 6], 10, 0),
18+
([0, 3, 6], 2020, 436),
19+
([1, 3, 2], 2020, 1),
20+
([2, 1, 3], 2020, 10),
21+
([1, 2, 3], 2020, 27),
22+
([2, 3, 1], 2020, 78),
23+
([3, 2, 1], 2020, 438),
24+
([3, 1, 2], 2020, 1836),
25+
])
26+
def test_solve_part_one(starting_list, rounds, expected):
27+
assert solve(starting_list, rounds) == expected
28+
29+
30+
def test_part_one():
31+
assert part_one(test_input) == 436
32+
33+
34+
@pytest.mark.skipif(os.getenv('CI', 0) == 'true', reason='slow test')
35+
def test_part_two():
36+
assert part_two(test_input) == 175594

0 commit comments

Comments
 (0)