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()