Solution to problem 6 in Python
This commit is contained in:
parent
3d2a23a89d
commit
aa01846a77
152
src/Year_2023/Day06.py
Normal file
152
src/Year_2023/Day06.py
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
# --- Day 6: Wait For It ---
|
||||||
|
|
||||||
|
# The ferry quickly brings you across Island Island. After asking around, you
|
||||||
|
# discover that there is indeed normally a large pile of sand somewhere near
|
||||||
|
# here, but you don't see anything besides lots of water and the small island
|
||||||
|
# where the ferry has docked.
|
||||||
|
|
||||||
|
# As you try to figure out what to do next, you notice a poster on a wall near
|
||||||
|
# the ferry dock. "Boat races! Open to the public! Grand prize is an
|
||||||
|
# all-expenses-paid trip to Desert Island!" That must be where the sand comes
|
||||||
|
# from! Best of all, the boat races are starting in just a few minutes.
|
||||||
|
|
||||||
|
# You manage to sign up as a competitor in the boat races just in time. The
|
||||||
|
# organizer explains that it's not really a traditional race - instead, you will
|
||||||
|
# get a fixed amount of time during which your boat has to travel as far as it
|
||||||
|
# can, and you win if your boat goes the farthest.
|
||||||
|
|
||||||
|
# As part of signing up, you get a sheet of paper (your puzzle input) that lists
|
||||||
|
# the time allowed for each race and also the best distance ever recorded in
|
||||||
|
# that race. To guarantee you win the grand prize, you need to make sure you go
|
||||||
|
# farther in each race than the current record holder.
|
||||||
|
|
||||||
|
# The organizer brings you over to the area where the boat races are held. The
|
||||||
|
# boats are much smaller than you expected - they're actually toy boats, each
|
||||||
|
# with a big button on top. Holding down the button charges the boat, and
|
||||||
|
# releasing the button allows the boat to move. Boats move faster if their
|
||||||
|
# button was held longer, but time spent holding the button counts against the
|
||||||
|
# total race time. You can only hold the button at the start of the race, and
|
||||||
|
# boats don't move until the button is released.
|
||||||
|
|
||||||
|
# For example:
|
||||||
|
|
||||||
|
# Time: 7 15 30
|
||||||
|
# Distance: 9 40 200
|
||||||
|
|
||||||
|
# This document describes three races:
|
||||||
|
|
||||||
|
# The first race lasts 7 milliseconds. The record distance in this race is
|
||||||
|
# 9 millimeters.
|
||||||
|
# The second race lasts 15 milliseconds. The record distance in this race is
|
||||||
|
# 40 millimeters.
|
||||||
|
# The third race lasts 30 milliseconds. The record distance in this race is
|
||||||
|
# 200 millimeters.
|
||||||
|
|
||||||
|
# Your toy boat has a starting speed of zero millimeters per millisecond. For
|
||||||
|
# each whole millisecond you spend at the beginning of the race holding down the
|
||||||
|
# button, the boat's speed increases by one millimeter per millisecond.
|
||||||
|
|
||||||
|
# So, because the first race lasts 7 milliseconds, you only have a few options:
|
||||||
|
|
||||||
|
# Don't hold the button at all (that is, hold it for 0 milliseconds) at the
|
||||||
|
# start of the race. The boat won't move; it will have traveled 0 millimeters by
|
||||||
|
# the end of the race.
|
||||||
|
# Hold the button for 1 millisecond at the start of the race. Then, the boat
|
||||||
|
# will travel at a speed of 1 millimeter per millisecond for 6 milliseconds,
|
||||||
|
# reaching a total distance traveled of 6 millimeters.
|
||||||
|
# Hold the button for 2 milliseconds, giving the boat a speed of 2
|
||||||
|
# millimeters per millisecond. It will then get 5 milliseconds to move, reaching
|
||||||
|
# a total distance of 10 millimeters.
|
||||||
|
# Hold the button for 3 milliseconds. After its remaining 4 milliseconds of
|
||||||
|
# travel time, the boat will have gone 12 millimeters.
|
||||||
|
# Hold the button for 4 milliseconds. After its remaining 3 milliseconds of
|
||||||
|
# travel time, the boat will have gone 12 millimeters.
|
||||||
|
# Hold the button for 5 milliseconds, causing the boat to travel a total of
|
||||||
|
# 10 millimeters.
|
||||||
|
# Hold the button for 6 milliseconds, causing the boat to travel a total of
|
||||||
|
# 6 millimeters.
|
||||||
|
# Hold the button for 7 milliseconds. That's the entire duration of the
|
||||||
|
# race. You never let go of the button. The boat can't move until you let go of
|
||||||
|
# the button. Please make sure you let go of the button so the boat gets to
|
||||||
|
# move. 0 millimeters.
|
||||||
|
|
||||||
|
# Since the current record for this race is 9 millimeters, there are actually 4
|
||||||
|
# different ways you could win: you could hold the button for 2, 3, 4, or 5
|
||||||
|
# milliseconds at the start of the race.
|
||||||
|
|
||||||
|
# In the second race, you could hold the button for at least 4 milliseconds and
|
||||||
|
# at most 11 milliseconds and beat the record, a total of 8 different ways to
|
||||||
|
# win.
|
||||||
|
|
||||||
|
# In the third race, you could hold the button for at least 11 milliseconds and
|
||||||
|
# no more than 19 milliseconds and still beat the record, a total of 9 ways you
|
||||||
|
# could win.
|
||||||
|
|
||||||
|
# To see how much margin of error you have, determine the number of ways you can
|
||||||
|
# beat the record in each race; in this example, if you multiply these values
|
||||||
|
# together, you get 288 (4 * 8 * 9).
|
||||||
|
|
||||||
|
# Determine the number of ways you could beat the record in each race. What do
|
||||||
|
# you get if you multiply these numbers together?
|
||||||
|
|
||||||
|
with open("files/P6.txt") as f:
|
||||||
|
times, distances = [line for line in f.read().strip().split("\n")]
|
||||||
|
|
||||||
|
times = [int(t) for t in times.split(":")[1].split()]
|
||||||
|
distances = [int(d) for d in distances.split(":")[1].split()]
|
||||||
|
|
||||||
|
|
||||||
|
def part1():
|
||||||
|
total = 1
|
||||||
|
for idx, time in enumerate(times):
|
||||||
|
res = 0
|
||||||
|
for t in range(time):
|
||||||
|
d = t * (time - t)
|
||||||
|
if d > distances[idx]:
|
||||||
|
res += 1
|
||||||
|
total *= res
|
||||||
|
|
||||||
|
print(f"There are {total} ways of beating the record")
|
||||||
|
|
||||||
|
|
||||||
|
# --- Part Two ---
|
||||||
|
|
||||||
|
# As the race is about to start, you realize the piece of paper with race times
|
||||||
|
# and record distances you got earlier actually just has very bad kerning.
|
||||||
|
# There's really only one race - ignore the spaces between the numbers on each
|
||||||
|
# line.
|
||||||
|
|
||||||
|
# So, the example from before:
|
||||||
|
|
||||||
|
# Time: 7 15 30
|
||||||
|
# Distance: 9 40 200
|
||||||
|
|
||||||
|
# ...now instead means this:
|
||||||
|
|
||||||
|
# Time: 71530
|
||||||
|
# Distance: 940200
|
||||||
|
|
||||||
|
# Now, you have to figure out how many ways there are to win this single race.
|
||||||
|
# In this example, the race lasts for 71530 milliseconds and the record distance
|
||||||
|
# you need to beat is 940200 millimeters. You could hold the button anywhere
|
||||||
|
# from 14 to 71516 milliseconds and beat the record, a total of 71503 ways!
|
||||||
|
|
||||||
|
# How many ways can you beat the record in this one much longer race?
|
||||||
|
|
||||||
|
time = int("".join(str(t) for t in times))
|
||||||
|
distance = int("".join(str(d) for d in distances))
|
||||||
|
|
||||||
|
|
||||||
|
def part2():
|
||||||
|
total = 0
|
||||||
|
for t in range(time):
|
||||||
|
d = t * (time - t)
|
||||||
|
if d > distance:
|
||||||
|
total += 1
|
||||||
|
|
||||||
|
print(f"There are {total} ways of beating the record")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
part1()
|
||||||
|
part2()
|
Loading…
x
Reference in New Issue
Block a user