Solution to problem 1 in Python
This commit is contained in:
parent
58fc01c001
commit
652ffef709
113
src/Year_2018/P1.py
Normal file
113
src/Year_2018/P1.py
Normal file
@ -0,0 +1,113 @@
|
||||
# --- Day 1: Chronal Calibration ---
|
||||
|
||||
# "We've detected some temporal anomalies," one of Santa's Elves at the
|
||||
# Temporal Anomaly Research and Detection Instrument Station tells you. She
|
||||
# sounded pretty worried when she called you down here. "At 500-year intervals
|
||||
# into the past, someone has been changing Santa's history!"
|
||||
|
||||
# "The good news is that the changes won't propagate to our time stream for
|
||||
# another 25 days, and we have a device" - she attaches something to your wrist
|
||||
# - "that will let you fix the changes with no such propagation delay. It's
|
||||
# configured to send you 500 years further into the past every few days; that
|
||||
# was the best we could do on such short notice."
|
||||
|
||||
# "The bad news is that we are detecting roughly fifty anomalies throughout
|
||||
# time; the device will indicate fixed anomalies with stars. The other bad news
|
||||
# is that we only have one device and you're the best person for the job! Good
|
||||
# lu--" She taps a button on the device and you suddenly feel like you're
|
||||
# falling. To save Christmas, you need to get all fifty stars by December 25th.
|
||||
|
||||
# Collect stars by solving puzzles. Two puzzles will be made available on each
|
||||
# day in the Advent calendar; the second puzzle is unlocked when you complete
|
||||
# the first. Each puzzle grants one star. Good luck!
|
||||
|
||||
# After feeling like you've been falling for a few minutes, you look at the
|
||||
# device's tiny screen. "Error: Device must be calibrated before first use.
|
||||
# Frequency drift detected. Cannot maintain destination lock." Below the
|
||||
# message, the device shows a sequence of changes in frequency (your puzzle
|
||||
# input). A value like +6 means the current frequency increases by 6; a value
|
||||
# like -3 means the current frequency decreases by 3.
|
||||
|
||||
# For example, if the device displays frequency changes of +1, -2, +3, +1, then
|
||||
# starting from a frequency of zero, the following changes would occur:
|
||||
|
||||
# Current frequency 0, change of +1; resulting frequency 1.
|
||||
# Current frequency 1, change of -2; resulting frequency -1.
|
||||
# Current frequency -1, change of +3; resulting frequency 2.
|
||||
# Current frequency 2, change of +1; resulting frequency 3.
|
||||
|
||||
# In this example, the resulting frequency is 3.
|
||||
|
||||
# Here are other example situations:
|
||||
|
||||
# +1, +1, +1 results in 3
|
||||
# +1, +1, -2 results in 0
|
||||
# -1, -2, -3 results in -6
|
||||
|
||||
# Starting with a frequency of zero, what is the resulting frequency after all
|
||||
# of the changes in frequency have been applied?
|
||||
|
||||
with open("files/P1.txt") as f:
|
||||
frequencies = [int(number) for number in f.read().strip().split()]
|
||||
|
||||
|
||||
def part_1() -> None:
|
||||
init = 0
|
||||
for change in frequencies:
|
||||
init += change
|
||||
|
||||
print(f"The resulting frequency is {init}")
|
||||
|
||||
|
||||
# --- Part Two ---
|
||||
|
||||
# You notice that the device repeats the same frequency change list over and
|
||||
# over. To calibrate the device, you need to find the first frequency it
|
||||
# reaches twice.
|
||||
|
||||
# For example, using the same list of changes above, the device would loop as
|
||||
# follows:
|
||||
|
||||
# Current frequency 0, change of +1; resulting frequency 1.
|
||||
# Current frequency 1, change of -2; resulting frequency -1.
|
||||
# Current frequency -1, change of +3; resulting frequency 2.
|
||||
# Current frequency 2, change of +1; resulting frequency 3.
|
||||
# (At this point, the device continues from the start of the list.)
|
||||
# Current frequency 3, change of +1; resulting frequency 4.
|
||||
# Current frequency 4, change of -2; resulting frequency 2, which has
|
||||
# already been seen.
|
||||
|
||||
# In this example, the first frequency reached twice is 2. Note that your
|
||||
# device might need to repeat its list of frequency changes many times before a
|
||||
# duplicate frequency is found, and that duplicates might be found while in the
|
||||
# middle of processing the list.
|
||||
|
||||
# Here are other examples:
|
||||
|
||||
# +1, -1 first reaches 0 twice.
|
||||
# +3, +3, +4, -2, -4 first reaches 10 twice.
|
||||
# -6, +3, +8, +5, -6 first reaches 5 twice.
|
||||
# +7, +7, -2, -7, -4 first reaches 14 twice.
|
||||
|
||||
# What is the first frequency your device reaches twice?
|
||||
|
||||
|
||||
def part_2() -> None:
|
||||
visited = set()
|
||||
init = 0
|
||||
visited.add(init)
|
||||
repeated = False
|
||||
while not repeated:
|
||||
for change in frequencies:
|
||||
init += change
|
||||
if init not in visited:
|
||||
visited.add(init)
|
||||
else:
|
||||
repeated = True
|
||||
break
|
||||
print(f"The frequency reached twice is {init}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
part_1()
|
||||
part_2()
|
Loading…
Reference in New Issue
Block a user