Solution to problem 15 in Python

This commit is contained in:
David Doblas Jiménez 2021-12-23 11:46:52 +01:00
parent 33ba3ba044
commit d6233b113a

88
src/P15.py Normal file
View File

@ -0,0 +1,88 @@
# --- Day 15: Rambunctious Recitation ---
# You catch the airport shuttle and try to book a new flight to your vacation
# island. Due to the storm, all direct flights have been cancelled, but a route
# is available to get around the storm. You take it.
# While you wait for your flight, you decide to check in with the Elves back at
# the North Pole. They're playing a memory game and are ever so excited to
# explain the rules!
# In this game, the players take turns saying numbers. They begin by taking
# turns reading from a list of starting numbers (your puzzle input). Then, each
# turn consists of considering the most recently spoken number:
# If that was the first time the number has been spoken, the current player
# says 0.
# Otherwise, the number had been spoken before; the current player
# announces how many turns apart the number is from when it was previously
# spoken.
# So, after the starting numbers, each turn results in that player speaking
# aloud either 0 (if the last number is new) or an age (if the last number is a
# repeat).
# For example, suppose the starting numbers are 0,3,6:
# Turn 1: The 1st number spoken is a starting number, 0.
# Turn 2: The 2nd number spoken is a starting number, 3.
# Turn 3: The 3rd number spoken is a starting number, 6.
# Turn 4: Now, consider the last number spoken, 6. Since that was the first
# time the number had been spoken, the 4th number spoken is 0.
# Turn 5: Next, again consider the last number spoken, 0. Since it had been
# spoken before, the next number to speak is the difference between the turn
# number when it was last spoken (the previous turn, 4) and the turn number of
# the time it was most recently spoken before then (turn 1). Thus, the 5th
# number spoken is 4 - 1, 3.
# Turn 6: The last number spoken, 3 had also been spoken before, most
# recently on turns 5 and 2. So, the 6th number spoken is 5 - 2, 3.
# Turn 7: Since 3 was just spoken twice in a row, and the last two turns
# are 1 turn apart, the 7th number spoken is 1.
# Turn 8: Since 1 is new, the 8th number spoken is 0.
# Turn 9: 0 was last spoken on turns 8 and 4, so the 9th number spoken is
# the difference between them, 4.
# Turn 10: 4 is new, so the 10th number spoken is 0.
# (The game ends when the Elves get sick of playing or dinner is ready,
# whichever comes first.)
# Their question for you is: what will be the 2020th number spoken? In the
# example above, the 2020th number spoken will be 436.
# Here are a few more examples:
# Given the starting numbers 1,3,2, the 2020th number spoken is 1.
# Given the starting numbers 2,1,3, the 2020th number spoken is 10.
# Given the starting numbers 1,2,3, the 2020th number spoken is 27.
# Given the starting numbers 2,3,1, the 2020th number spoken is 78.
# Given the starting numbers 3,2,1, the 2020th number spoken is 438.
# Given the starting numbers 3,1,2, the 2020th number spoken is 1836.
# Given your starting numbers, what will be the 2020th number spoken?
from collections import defaultdict
with open("files/P15.txt", "r") as f:
sequence = [int(val) for val in f.read().strip().split(",")]
numbers = defaultdict(list)
for idx, number in enumerate(sequence):
numbers[number].append(idx)
def part_1() -> None:
last = list(numbers.keys())[-1]
for i in range(len(sequence), 2020):
if len(numbers[last]) < 2:
numbers[0].append(i)
last = 0
else:
last = numbers[last][-1] - numbers[last][-2]
numbers[last].append(i)
print(f"The 2020th number spoken is {last}")
if __name__ == "__main__":
part_1()