diff --git a/2020-python/solutions/day_15.py b/2020-python/solutions/day_15.py index 9755c4e..762a7a7 100644 --- a/2020-python/solutions/day_15.py +++ b/2020-python/solutions/day_15.py @@ -13,42 +13,35 @@ def read_input(input_path: str) -> str: def extract(input_data: str) -> list: """take input data and return the appropriate data structure""" - entries = input_data.split(',') + entries = list(map(int, input_data.split(','))) return entries +def calculate_last_spoken(numbers: list, turns: int) -> int: + """calculate the last spoken number at specified turn""" + spoken = [0]*turns + last_spoken = -1 + + for turn, number in enumerate(numbers, 1): + spoken[number] = turn + last_spoken = number + + for prev_turn in range(len(numbers), turns): + if spoken[last_spoken] != 0: + current_spoken = prev_turn - spoken[last_spoken] + else: + current_spoken = 0 + spoken[last_spoken] = prev_turn + last_spoken = current_spoken + + return last_spoken + def part1(entries: dict) -> int: """part1 solver""" - spoken = dict() - last_spoken = '-1' - for turn, number in enumerate(entries, 1): - spoken[number] = [turn] - last_spoken = number - for i in range(len(entries)+1, 2020+1): - if len(spoken.get(last_spoken, [])) < 2: - spoken.setdefault('0', []).append(i) - last_spoken = '0' - else: - number = str(int(spoken[last_spoken][-1]) - int(spoken[last_spoken][-2])) - spoken.setdefault(number, []).append(i) - last_spoken = number - return int(last_spoken) + return calculate_last_spoken(entries, 2020) def part2(entries: tuple) -> int: """part2 solver""" - spoken = dict() - last_spoken = '-1' - for turn, number in enumerate(entries, 1): - spoken[number] = [turn] - last_spoken = number - for i in range(len(entries)+1, 30000000+1): - if len(spoken.get(last_spoken, [])) < 2: - spoken.setdefault('0', []).append(i) - last_spoken = '0' - else: - number = str(int(spoken[last_spoken][-1]) - int(spoken[last_spoken][-2])) - spoken.setdefault(number, []).append(i) - last_spoken = number - return int(last_spoken) + return calculate_last_spoken(entries, 30000000) def test_input_day_15(): """pytest testing function""" diff --git a/README.md b/README.md index 3b5d859..e838696 100644 --- a/README.md +++ b/README.md @@ -24,3 +24,4 @@ | [Day 12](https://adventofcode.com/2020/day/12) | [746.181µs](./2020-python/solutions/day_12.py) | [211.216µs](./2020-python/solutions/day_12.py) | | [Day 13](https://adventofcode.com/2020/day/13) | [122.107µs](./2020-python/solutions/day_13.py) | [100.671µs](./2020-python/solutions/day_13.py) | | [Day 14](https://adventofcode.com/2020/day/14) | [64.058ms](./2020-python/solutions/day_14.py) | [56.398ms](./2020-python/solutions/day_14.py) | +| [Day 15](https://adventofcode.com/2020/day/15) | [4.463s](./2020-python/solutions/day_15.py) | [718.712ms](./2020-python/solutions/day_15.py) |