advent-of-code/2023-python/output/day_06.py

47 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(f"./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