49 lines
1.3 KiB
Python
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()
|