day 6 fancy solution + cleanup

main
magical 2023-12-06 06:19:22 +00:00
parent b480088127
commit ed146f7fe1
1 changed files with 42 additions and 5 deletions

View File

@ -1,11 +1,12 @@
from math import sqrt
sample = { sample = {
"time": [7, 15, 30], "time": [7, 15, 30],
"distance": [9, 40, 200], "distance": [9, 40, 200],
} }
input = { input = {
"time": [ 48, 87, 69, 81,], "time": [ 48, 87, 69, 81,],
"distance": [ 255, 1288, 1117, 1623,], "distance": [ 255, 1288, 1117, 1623,],
} }
@ -21,18 +22,54 @@ def solve(data):
d = (t-i)*v d = (t-i)*v
if d > best: if d > best:
ways += 1 ways += 1
part1 *= ways part1 *= ways
return part1 return part1
def fancy_solve(data):
time = data["time"]
dist = data["distance"]
for t, best in zip(time, dist):
# the distance traveled if the boat is released at time i
# is equal to (t-i)*i
# we want to know the range of values of i for which this
# exceeds the best time
# (t-i)*i > best
# a little rearranging gets us the quadratic equation
# i^2 - ti + best <= 0
# which we can determine the crossing points for
# using the quadratic formula (the good one, not the
# one you learned in school)
h = t/2
s = sqrt(h*h - best)
#print(h-s, h+s)
# in general these will not be at integer values,
# so we probe the floor and ceiling of each crossing
# point to determine exactly where the condition is met
a = int(h-s)
b = int(h+s)
if (t-a)*a <= best:
a += 1
if (t-b)*b > best:
b += 1
ways = b - a
return ways
print(solve(sample)) print(solve(sample))
print(solve(input)) print(solve(input))
def part2(data): def part2(data):
return {"time": [int("".join(str(x) for x in data["time"]))], return {"time": [int("".join(str(x) for x in data["time"]))],
"distance": [int("".join(str(x) for x in data["distance"]))]} "distance": [int("".join(str(x) for x in data["distance"]))]}
print(solve(part2(sample))) print(solve(part2(sample)))
print(solve(part2(input))) print(fancy_solve(part2(sample)))
print(fancy_solve(part2(input)))