Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
Multiple Lightbulbs solution in Creative category for Multiple Lightbulbs by tssrkt777
from typing import List, Optional, Union, Tuple
from datetime import datetime
# Находится ли время начала или конца отсчета перед включением лампочки
def is_before(sw, dt):
if sw.year >= dt.year:
if sw.year>dt.year:
return False
if sw.month >= dt.month:
if sw.month>dt.month:
return False
if sw.day >= dt.day:
if sw.day>dt.day:
return False
if sw.hour >= dt.hour:
if sw.hour>dt.hour:
return False
if sw.minute >= dt.minute:
if sw.minute>dt.minute:
return False
if sw.second >= dt.second:
return False
else: return True
else: return True
else: return True
else: return True
else: return True
else: return True
def lopata(els, sw=None, se=None):
res = 0
lst = []
# Передано ли время окончания после последнего горения
if len(els) % 2 != 0:
els.append(0)
# Группируем время включения и отключения лампочки
for x in range(0, len(els) - 1, 2):
lst.append([els[x], els[x + 1]])
# Если передано время начала наблюдения
if sw != None:
for x in range(len(lst)):
if not is_before(sw, lst[x][0]):
if lst[x][1] == 0 or is_before(sw, lst[x][1]):
lst[x][0] = sw
break
else:
lst[x] = 0
else:
break
# Если время горения не попало в диапазон наблюдения
if lst == [0]:
return 0
# Если предано время окончания горения лампочки
if se != None:
for x in range(len(lst) - 1, -1, -1):
if lst[x][1] == 0 or is_before(se, lst[x][1]):
if not is_before(se, lst[x][0]):
lst[x][-1] = se
break
else:
lst[x] = 0
else:
break
# Рассчет количества секунд горения лампочки
for x in lst:
if x != 0:
x = str(x[1] - x[0])
if 'day' not in x:
c = list(map(int, x.split(':')))
res += c[0] * 60 * 60 + c[1] * 60 + c[2]
else:
a = list(map(str, x.split()))
c = list(map(int, a[-1].split(':')))
res += int(a[0]) * 24 * 60 * 60 + c[0] * 60 * 60 + c[1] * 60 + c[2]
return res
def delete_zero(grp):
"""Удаляем ноли из списка с группами ламп"""
import itertools as it
lamps = list(it.filterfalse(lambda x: x == 0, grp))
return lamps
def sum_light(els: List[datetime], start_watching=None, end_watching=None) -> int:
"""
Сколько времени горела лампочка?
:param els: tuple of datetime
:param start_watching: datetime
:param end_watching: datetime
:return: int
"""
sw = start_watching
se = end_watching
res = 0
# Группируем время горения разных лапочек
lamps = []
many_lamps = False
for x in els:
if isinstance(x, (tuple, list)):
many_lamps = True
# Если одна лампа
if not many_lamps:
res = lopata(els, sw, se)
return res
swt_on_1 = 0
swt_on_2 = 0
swt_on_3 = 0
# Если ламп много
for x in range(len(els)):
if isinstance(els[x], (tuple, list)):
if els[x][-1]==2:
swt_on_2 = 2 if swt_on_2 == 0 and els[x][-1]==2 else 0
els[x] = 0 if swt_on_1 == 1 or swt_on_3 == 3 else els[x]
elif els[x][-1]==3:
swt_on_3 = 3 if swt_on_3 == 0 and els[x][-1] == 3 else 0
els[x]=0 if swt_on_1 == 1 or swt_on_2 == 2 else els[x]
elif isinstance(els[x], datetime):
swt_on_1 = 1 if swt_on_1 == 0 else 0
els[x]=0 if swt_on_2 == 2 or swt_on_3 == 3 else els[x]
lamps = []
for x in els:
if isinstance(x, (tuple, list)):
lamps.append(x[0])
elif isinstance(x, datetime):
lamps.append(x)
for x in range(1, len(lamps)-1, 2):
if lamps[x]==lamps[x+1]:
lamps[x]=0
lamps[x+1]=0
elif lamps[x]>lamps[x+1]:
if lamps[x]
Sept. 8, 2021
Comments: