Solution to problem 15 in Python
This commit is contained in:
88
src/P15.py
Normal file
88
src/P15.py
Normal 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()
|
||||||
Reference in New Issue
Block a user