Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for Lightbulb Operating by DronovDen
from datetime import datetime, timedelta
from typing import List, Optional, Union
from collections import defaultdict
def get_bulbs_timelines(els):
timelines = defaultdict(list)
for el in els:
if isinstance(el, datetime):
timelines[0].append(el)
else:
timelines[el[1]].append(el[0])
return timelines
def get_working_intervals(timelines, start_watching, end_watching, operating):
intervals = set()
for lightbulb in timelines.keys():
remaining = operating
if len(timelines[lightbulb]) % 2 == 1:
if timelines[lightbulb][-1] < end_watching:
timelines[lightbulb].append(end_watching)
else:
timelines[lightbulb].pop()
for start_point, end_point in zip(timelines[lightbulb][::2], timelines[lightbulb][1::2]):
if operating and remaining <= timedelta(0):
continue
if operating:
end_point = min(end_point, start_point + remaining)
remaining -= (end_point - start_point)
if (start_watching and end_point <= start_watching) or (end_watching and end_watching <= start_point):
continue
intervals.add((max(start_watching or start_point, start_point), min(end_watching or end_point, end_point)))
return intervals
def get_merged_intervals(working_intervals):
intervals = sorted(working_intervals)
merged_intervals = [intervals[0]]
for interval in intervals[1:]:
if interval[0] <= merged_intervals[-1][1]:
merged_intervals[-1] = (merged_intervals[-1][0], (max(merged_intervals[-1][1], interval[1])))
else:
merged_intervals.append(interval)
return merged_intervals
def sum_light(els: List[Union[datetime, tuple[datetime, int]]],
start_watching: Optional[datetime] = None,
end_watching: Optional[datetime] = None,
operating: Optional[timedelta] = None) -> int:
# getting timeline dictionary by each lightbulb
timelines = get_bulbs_timelines(els)
# get set of lighting intervals depending on watching and operating time
working_intervals = get_working_intervals(timelines, start_watching, end_watching, operating)
if not working_intervals:
return 0
# merge overlapping intervals
merged_intervals = get_merged_intervals(working_intervals)
return sum(int((end_point - start_point).total_seconds()) for start_point, end_point in merged_intervals)
if __name__ == "__main__":
print("Example:")
print(
sum_light(
[
(datetime(2015, 1, 12, 10, 0, 10), 3),
datetime(2015, 1, 12, 10, 0, 20),
(datetime(2015, 1, 12, 10, 0, 30), 3),
(datetime(2015, 1, 12, 10, 0, 30), 2),
],
start_watching=datetime(2015, 1, 12, 10, 0, 10),
end_watching=datetime(2015, 1, 12, 10, 0, 30),
operating=timedelta(seconds=5),
)
)
assert (
sum_light(
[
datetime(2015, 1, 12, 10, 0, 0),
(datetime(2015, 1, 12, 10, 0, 0), 2),
datetime(2015, 1, 12, 10, 0, 10),
(datetime(2015, 1, 12, 10, 1, 0), 2),
]
)
== 60
)
assert (
sum_light(
[
datetime(2015, 1, 12, 10, 0, 0),
datetime(2015, 1, 12, 10, 0, 10),
(datetime(2015, 1, 12, 11, 0, 0), 2),
(datetime(2015, 1, 12, 11, 1, 0), 2),
]
)
== 70
)
assert (
sum_light(
[
datetime(2015, 1, 12, 10, 0, 20),
(datetime(2015, 1, 12, 10, 0, 30), 2),
datetime(2015, 1, 12, 10, 0, 40),
(datetime(2015, 1, 12, 10, 0, 50), 2),
]
)
== 30
)
assert (
sum_light(
[
(datetime(2015, 1, 12, 10, 0, 10), 3),
datetime(2015, 1, 12, 10, 0, 20),
(datetime(2015, 1, 12, 10, 0, 30), 3),
(datetime(2015, 1, 12, 10, 0, 30), 2),
datetime(2015, 1, 12, 10, 0, 40),
(datetime(2015, 1, 12, 10, 0, 50), 2),
]
)
== 40
)
assert (
sum_light(
[
(datetime(2015, 1, 12, 10, 0, 10), 3),
datetime(2015, 1, 12, 10, 0, 20),
(datetime(2015, 1, 12, 10, 0, 30), 3),
(datetime(2015, 1, 12, 10, 0, 30), 2),
datetime(2015, 1, 12, 10, 0, 40),
(datetime(2015, 1, 12, 10, 0, 50), 2),
(datetime(2015, 1, 12, 10, 1, 0), 3),
(datetime(2015, 1, 12, 10, 1, 20), 3),
]
)
== 60
)
assert (
sum_light(
[
datetime(2015, 1, 12, 10, 0, 0),
(datetime(2015, 1, 12, 10, 0, 0), 2),
datetime(2015, 1, 12, 10, 0, 10),
(datetime(2015, 1, 12, 10, 1, 0), 2),
],
datetime(2015, 1, 12, 10, 0, 50),
)
== 10
)
assert (
sum_light(
[
datetime(2015, 1, 12, 10, 0, 20),
(datetime(2015, 1, 12, 10, 0, 30), 2),
datetime(2015, 1, 12, 10, 0, 40),
(datetime(2015, 1, 12, 10, 0, 50), 2),
],
datetime(2015, 1, 12, 10, 0, 30),
)
== 20
)
assert (
sum_light(
[
datetime(2015, 1, 12, 10, 0, 20),
(datetime(2015, 1, 12, 10, 0, 30), 2),
datetime(2015, 1, 12, 10, 0, 40),
(datetime(2015, 1, 12, 10, 0, 50), 2),
],
datetime(2015, 1, 12, 10, 0, 20),
)
== 30
)
assert (
sum_light(
[
datetime(2015, 1, 12, 10, 0, 20),
(datetime(2015, 1, 12, 10, 0, 30), 2),
datetime(2015, 1, 12, 10, 0, 40),
(datetime(2015, 1, 12, 10, 0, 50), 2),
],
datetime(2015, 1, 12, 10, 0, 10),
)
== 30
)
assert (
sum_light(
[
datetime(2015, 1, 12, 10, 0, 20),
(datetime(2015, 1, 12, 10, 0, 30), 2),
datetime(2015, 1, 12, 10, 0, 40),
(datetime(2015, 1, 12, 10, 0, 50), 2),
],
datetime(2015, 1, 12, 10, 0, 50),
)
== 0
)
assert (
sum_light(
[
(datetime(2015, 1, 12, 10, 0, 10), 3),
datetime(2015, 1, 12, 10, 0, 20),
(datetime(2015, 1, 12, 10, 0, 30), 3),
(datetime(2015, 1, 12, 10, 0, 30), 2),
datetime(2015, 1, 12, 10, 0, 40),
(datetime(2015, 1, 12, 10, 0, 50), 2),
],
datetime(2015, 1, 12, 10, 0, 30),
)
== 20
)
assert (
sum_light(
[
(datetime(2015, 1, 12, 10, 0, 10), 3),
datetime(2015, 1, 12, 10, 0, 20),
(datetime(2015, 1, 12, 10, 0, 30), 3),
(datetime(2015, 1, 12, 10, 0, 30), 2),
datetime(2015, 1, 12, 10, 0, 40),
(datetime(2015, 1, 12, 10, 0, 50), 2),
],
datetime(2015, 1, 12, 10, 0, 20),
)
== 30
)
assert (
sum_light(
[
(datetime(2015, 1, 12, 10, 0, 10), 3),
datetime(2015, 1, 12, 10, 0, 20),
(datetime(2015, 1, 12, 10, 0, 30), 3),
(datetime(2015, 1, 12, 10, 0, 30), 2),
datetime(2015, 1, 12, 10, 0, 40),
(datetime(2015, 1, 12, 10, 0, 50), 2),
(datetime(2015, 1, 12, 10, 1, 20), 2),
(datetime(2015, 1, 12, 10, 1, 40), 2),
],
datetime(2015, 1, 12, 10, 0, 20),
)
== 50
)
assert (
sum_light(
[
datetime(2015, 1, 12, 10, 0, 0),
(datetime(2015, 1, 12, 10, 0, 0), 2),
datetime(2015, 1, 12, 10, 0, 10),
(datetime(2015, 1, 12, 10, 1, 0), 2),
],
datetime(2015, 1, 12, 10, 0, 30),
datetime(2015, 1, 12, 10, 1, 0),
)
== 30
)
assert (
sum_light(
[
datetime(2015, 1, 12, 10, 0, 0),
(datetime(2015, 1, 12, 10, 0, 0), 2),
datetime(2015, 1, 12, 10, 0, 10),
(datetime(2015, 1, 12, 10, 1, 0), 2),
],
datetime(2015, 1, 12, 10, 0, 20),
datetime(2015, 1, 12, 10, 1, 0),
)
== 40
)
assert (
sum_light(
[
datetime(2015, 1, 12, 10, 0, 0),
(datetime(2015, 1, 12, 10, 0, 0), 2),
datetime(2015, 1, 12, 10, 0, 10),
],
datetime(2015, 1, 12, 10, 0, 0),
datetime(2015, 1, 12, 10, 0, 30),
)
== 30
)
assert (
sum_light(
[
(datetime(2015, 1, 12, 10, 0, 10), 3),
datetime(2015, 1, 12, 10, 0, 20),
(datetime(2015, 1, 12, 10, 0, 30), 3),
(datetime(2015, 1, 12, 10, 0, 30), 2),
datetime(2015, 1, 12, 10, 0, 40),
(datetime(2015, 1, 12, 10, 0, 50), 2),
],
datetime(2015, 1, 12, 10, 0, 0),
datetime(2015, 1, 12, 10, 1, 0),
)
== 40
)
assert (
sum_light(
[
(datetime(2015, 1, 12, 10, 0, 10), 3),
datetime(2015, 1, 12, 10, 0, 20),
(datetime(2015, 1, 12, 10, 0, 30), 3),
(datetime(2015, 1, 12, 10, 0, 30), 2),
datetime(2015, 1, 12, 10, 0, 40),
(datetime(2015, 1, 12, 10, 0, 50), 2),
],
datetime(2015, 1, 12, 10, 0, 0),
datetime(2015, 1, 12, 10, 0, 10),
)
== 0
)
assert (
sum_light(
[
(datetime(2015, 1, 12, 10, 0, 10), 3),
datetime(2015, 1, 12, 10, 0, 20),
(datetime(2015, 1, 12, 10, 0, 30), 3),
(datetime(2015, 1, 12, 10, 0, 30), 2),
datetime(2015, 1, 12, 10, 0, 40),
(datetime(2015, 1, 12, 10, 0, 50), 2),
],
datetime(2015, 1, 12, 10, 0, 10),
datetime(2015, 1, 12, 10, 0, 20),
)
== 10
)
assert (
sum_light(
[
(datetime(2015, 1, 12, 10, 0, 10), 3),
datetime(2015, 1, 12, 10, 0, 20),
(datetime(2015, 1, 12, 10, 0, 30), 3),
(datetime(2015, 1, 12, 10, 0, 30), 2),
],
datetime(2015, 1, 12, 10, 0, 10),
datetime(2015, 1, 12, 10, 0, 20),
)
== 10
)
assert (
sum_light(
[
(datetime(2015, 1, 12, 10, 0, 10), 3),
datetime(2015, 1, 12, 10, 0, 20),
(datetime(2015, 1, 12, 10, 0, 30), 3),
(datetime(2015, 1, 12, 10, 0, 30), 2),
],
datetime(2015, 1, 12, 10, 0, 10),
datetime(2015, 1, 12, 10, 0, 30),
)
== 20
)
assert (
sum_light(
els=[
(datetime(2015, 1, 11, 0, 0, 0), 3),
datetime(2015, 1, 12, 0, 0, 0),
(datetime(2015, 1, 13, 0, 0, 0), 3),
(datetime(2015, 1, 13, 0, 0, 0), 2),
datetime(2015, 1, 14, 0, 0, 0),
(datetime(2015, 1, 15, 0, 0, 0), 2),
],
start_watching=datetime(2015, 1, 10, 0, 0, 0),
end_watching=datetime(2015, 1, 16, 0, 0, 0),
)
== 345600
)
assert (
sum_light(
[
datetime(2015, 1, 12, 10, 0, 0),
datetime(2015, 1, 12, 10, 0, 10),
],
operating=timedelta(seconds=100),
)
== 10
)
assert (
sum_light(
[
datetime(2015, 1, 12, 10, 0, 0),
datetime(2015, 1, 12, 10, 0, 10),
],
operating=timedelta(seconds=5),
)
== 5
)
assert (
sum_light(
[
datetime(2015, 1, 12, 10, 0, 0),
datetime(2015, 1, 12, 10, 0, 10),
(datetime(2015, 1, 12, 10, 0, 0), 2),
(datetime(2015, 1, 12, 10, 1, 0), 2),
],
operating=timedelta(seconds=100),
)
== 60
)
assert (
sum_light(
[
datetime(2015, 1, 12, 10, 0, 0),
datetime(2015, 1, 12, 10, 0, 30),
(datetime(2015, 1, 12, 10, 0, 30), 2),
(datetime(2015, 1, 12, 10, 1, 0), 2),
],
operating=timedelta(seconds=100),
)
== 60
)
assert (
sum_light(
[
datetime(2015, 1, 12, 10, 0, 0),
datetime(2015, 1, 12, 10, 0, 30),
(datetime(2015, 1, 12, 10, 0, 30), 2),
(datetime(2015, 1, 12, 10, 1, 0), 2),
],
operating=timedelta(seconds=20),
)
== 40
)
assert (
sum_light(
[
(datetime(2015, 1, 12, 10, 0, 10), 3),
datetime(2015, 1, 12, 10, 0, 20),
(datetime(2015, 1, 12, 10, 0, 30), 3),
(datetime(2015, 1, 12, 10, 0, 30), 2),
datetime(2015, 1, 12, 10, 0, 40),
(datetime(2015, 1, 12, 10, 0, 50), 2),
(datetime(2015, 1, 12, 10, 1, 0), 3),
(datetime(2015, 1, 12, 10, 1, 20), 3),
],
operating=timedelta(seconds=10),
)
== 30
)
assert (
sum_light(
[
(datetime(2015, 1, 12, 10, 0, 10), 3),
datetime(2015, 1, 12, 10, 0, 20),
(datetime(2015, 1, 12, 10, 0, 30), 3),
(datetime(2015, 1, 12, 10, 0, 30), 2),
datetime(2015, 1, 12, 10, 0, 40),
(datetime(2015, 1, 12, 10, 0, 50), 2),
(datetime(2015, 1, 12, 10, 1, 20), 2),
(datetime(2015, 1, 12, 10, 1, 40), 2),
],
start_watching=datetime(2015, 1, 12, 10, 0, 20),
operating=timedelta(seconds=100),
)
== 50
)
assert (
sum_light(
[
(datetime(2015, 1, 12, 10, 0, 10), 3),
datetime(2015, 1, 12, 10, 0, 20),
(datetime(2015, 1, 12, 10, 0, 30), 3),
(datetime(2015, 1, 12, 10, 0, 30), 2),
datetime(2015, 1, 12, 10, 0, 40),
(datetime(2015, 1, 12, 10, 0, 50), 2),
(datetime(2015, 1, 12, 10, 1, 20), 2),
(datetime(2015, 1, 12, 10, 1, 40), 2),
],
start_watching=datetime(2015, 1, 12, 10, 0, 20),
operating=timedelta(seconds=10),
)
== 20
)
assert (
sum_light(
[
(datetime(2015, 1, 12, 10, 0, 10), 3),
datetime(2015, 1, 12, 10, 0, 20),
(datetime(2015, 1, 12, 10, 0, 30), 3),
(datetime(2015, 1, 12, 10, 0, 30), 2),
],
start_watching=datetime(2015, 1, 12, 10, 0, 10),
end_watching=datetime(2015, 1, 12, 10, 0, 30),
operating=timedelta(seconds=20),
)
== 20
)
assert (
sum_light(
[
(datetime(2015, 1, 12, 10, 0, 10), 3),
datetime(2015, 1, 12, 10, 0, 20),
(datetime(2015, 1, 12, 10, 0, 30), 3),
(datetime(2015, 1, 12, 10, 0, 30), 2),
],
start_watching=datetime(2015, 1, 12, 10, 0, 10),
end_watching=datetime(2015, 1, 12, 10, 0, 30),
operating=timedelta(seconds=10),
)
== 20
)
assert (
sum_light(
[
(datetime(2015, 1, 12, 10, 0, 10), 3),
datetime(2015, 1, 12, 10, 0, 20),
(datetime(2015, 1, 12, 10, 0, 30), 3),
(datetime(2015, 1, 12, 10, 0, 30), 2),
],
start_watching=datetime(2015, 1, 12, 10, 0, 10),
end_watching=datetime(2015, 1, 12, 10, 0, 30),
operating=timedelta(seconds=5),
)
== 10
)
print(
"The forth mission in series is completed? Click 'Check' to earn cool rewards!"
)
March 9, 2023