aoc2023/aoc/day06.py

49 lines
1.3 KiB
Python

from dataclasses import dataclass
from functools import reduce
from math import ceil, floor, sqrt
import re
from .aoc import Aoc2, AocSameImplementation
@dataclass
class Race:
time: int
distance: int
class Day06(AocSameImplementation[list[Race]], Aoc2[list[Race], list[Race]]):
def is_zero(self, to: int, d: int) -> tuple[int, int]:
return floor(to / 2 - sqrt((-to / 2) ** 2 - d) + 1), ceil(
to / 2 + sqrt((-to / 2) ** 2 - d) - 1
)
def parseinput2(self, inpt: str) -> list[Race]:
lines = inpt.splitlines()
times = int("".join(re.findall(r"\d+", lines[0])))
distances = int("".join(re.findall(r"\d+", lines[1])))
return [Race(times, distances)]
def parseinput1(self, inpt: str) -> list[Race]:
lines = inpt.splitlines()
times = (int(d) for d in re.findall(r"\d+", lines[0]))
distances = (int(d) for d in re.findall(r"\d+", lines[1]))
return [Race(*t) for t in zip(times, distances)]
def part(self, inpt: list[Race]) -> int:
return reduce(
lambda x, y: x * y,
(e - s + 1 for s, e in (self.is_zero(r.time, r.distance) for r in inpt)),
)
def main() -> None:
day06 = Day06(2023, 6)
day06.run()
if __name__ == "__main__":
main()