2023 day 6.
This commit is contained in:
parent
0f8a272b71
commit
4e1c71b221
49
2023/day6.py
49
2023/day6.py
@ -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}")
|
||||||
|
@ -0,0 +1,2 @@
|
|||||||
|
Time: 59 79 65 75
|
||||||
|
Distance: 597 1234 1032 1328
|
@ -0,0 +1,2 @@
|
|||||||
|
Time: 7 15 30
|
||||||
|
Distance: 9 40 200
|
Loading…
Reference in New Issue
Block a user