2023 day 6.

This commit is contained in:
Mikaël Capelle 2023-12-06 07:13:53 +01:00
parent 0f8a272b71
commit 4e1c71b221
3 changed files with 49 additions and 4 deletions

View File

@ -1,13 +1,54 @@
import operator
import sys import sys
from collections import defaultdict from functools import reduce
from dataclasses import dataclass
lines = sys.stdin.read().splitlines() lines = sys.stdin.read().splitlines()
def extreme_times_to_beat(time: int, distance: int) -> tuple[int, int]:
import math
# formula
# - distance = (T - t) * t
# - (T - t) * t >= D
# - T * t - t^2 - D >= 0
a = -1
b = time
c = -distance
d = b * b - 4 * a * c
t1 = math.ceil(-(b - math.sqrt(d)) / (2 * a))
t2 = math.floor(-(b + math.sqrt(d)) / (2 * a))
if (time - t1) * t1 == distance:
t1 += 1
if (time - t2) * t2 == distance:
t2 -= 1
return t1, t2
# part 1 # part 1
answer_1 = ... times = list(map(int, lines[0].split()[1:]))
distances = list(map(int, lines[1].split()[1:]))
answer_1 = reduce(
operator.mul,
(
t2 - t1 + 1
for t1, t2 in (
extreme_times_to_beat(time, distance)
for time, distance in zip(times, distances)
)
),
)
print(f"answer 1 is {answer_1}") print(f"answer 1 is {answer_1}")
# part 2 # part 2
answer_2 = ... time = int(lines[0].split(":")[1].strip().replace(" ", ""))
distance = int(lines[1].split(":")[1].strip().replace(" ", ""))
t1, t2 = extreme_times_to_beat(time, distance)
answer_2 = t2 - t1 + 1
print(f"answer 2 is {answer_2}") print(f"answer 2 is {answer_2}")

View File

@ -0,0 +1,2 @@
Time: 59 79 65 75
Distance: 597 1234 1032 1328

View File

@ -0,0 +1,2 @@
Time: 7 15 30
Distance: 9 40 200