48 lines
1.1 KiB
Python
48 lines
1.1 KiB
Python
|
|
from math import prod, sqrt, ceil, floor
|
||
|
|
from output import answer
|
||
|
|
|
||
|
|
n = 6
|
||
|
|
title = "Wait For It"
|
||
|
|
|
||
|
|
|
||
|
|
@answer(1, "The product of all record times for all races is {}")
|
||
|
|
def part_1(presolved):
|
||
|
|
return presolved[0]
|
||
|
|
|
||
|
|
|
||
|
|
@answer(2, "The product of all record times for the single long race is {}")
|
||
|
|
def part_2(presolved):
|
||
|
|
return presolved[1]
|
||
|
|
|
||
|
|
|
||
|
|
def presolve(data):
|
||
|
|
values = data.split()
|
||
|
|
l = len(values) // 2
|
||
|
|
races = list(
|
||
|
|
map(
|
||
|
|
lambda x: (int(x[0]), int(x[1])), list(zip(values[: l + 1], values[l:]))[1:]
|
||
|
|
)
|
||
|
|
)
|
||
|
|
p1 = prod(sum(bpt * (t - bpt) > d for bpt in range(t)) for t, d in races)
|
||
|
|
t = int("".join(values[1:l]))
|
||
|
|
d = int("".join(values[l + 1 :]))
|
||
|
|
# quadratic formula:
|
||
|
|
# https://en.wikipedia.org/wiki/Quadratic_formula
|
||
|
|
l = ceil((-t + sqrt(t**2 - 4 * d)) / -2)
|
||
|
|
h = floor((-t - sqrt(t**2 - 4 * d)) / -2)
|
||
|
|
p2 = h - l + 1
|
||
|
|
return p1, p2
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
with open("./input/06.txt", "r") as f:
|
||
|
|
inp = f.read().strip()
|
||
|
|
|
||
|
|
inp = presolve(inp)
|
||
|
|
|
||
|
|
a = part_1(inp)
|
||
|
|
b = part_2(inp)
|
||
|
|
|
||
|
|
assert a == 1083852
|
||
|
|
assert b == 23501589
|