@ -1,4 +1,4 @@
""" Задание на расчет интервалов, и вычисление времени, который ученик
""" Задание на расчет интервалов, и вычисление времени, которое ученик
и учитель присуствовали на уроке одновременно . """
tests = [
@ -74,7 +74,7 @@ tests = [
def get_smaller_interval ( interval_A , interval_B ) - > list :
""" Если один из интервалов включает в себя другой, возвращаем
меньший . Если интервалы не входят друг в дрг уа , возвращаем пустой
меньший . Если интервалы не входят друг в друг а , возвращаем пустой
интервал . """
if interval_A [ 0 ] < = interval_B [ 0 ] and interval_A [ 1 ] > = interval_B [ 1 ] :
return interval_B
@ -85,7 +85,6 @@ def get_smaller_interval(interval_A, interval_B) -> list:
return [ ]
# get_intervals_without_small_included_intervals
def absorb_small_included_intervals ( intervals : list ) - > list :
""" Возвращает список интервалов без вложенных интервалов.
@ -94,7 +93,7 @@ def absorb_small_included_intervals(intervals: list) -> list:
Стоит учитывать , что функция работает только если интервалы
совпадают по началу или концу , если интервалы входят друг в друга
частично - - мы их не обрабатываем .
частично ( пересекаются ) - - здесь мы их не обрабатываем .
"""
# формируем список из меньших интервалов, входящих в бОльшие
@ -116,16 +115,12 @@ def absorb_small_included_intervals(intervals: list) -> list:
def get_union_of_partly_intersecting_intervals ( interval_A , interval_B ) - > list :
""" Если интервалы А и Б пересекаются, то возвращаем новый
интервал , включающий А и Б . """
# планирую поступать по тому же принципу что и выше: добавлять
# сумму в исходный список, итого получим список с пересечениями,
# который потом можно прогнать через поглатитель меньших
# интервалов
# если один из интервалов пустой, то пересечение будет пустым
if not interval_A or not interval_B :
return [ ]
# если какой-то из ине трвалов имеет нулевую длину (начало=конец),
# если какой-то из инте рвалов имеет нулевую длину (начало=конец),
# то пересечение пустое
if interval_A [ 0 ] == interval_A [ 1 ] or interval_B [ 0 ] == interval_B [ 1 ] :
return [ ]
@ -136,7 +131,7 @@ def get_union_of_partly_intersecting_intervals(interval_A, interval_B) -> list:
if interval_A [ 0 ] > interval_B [ 1 ] or interval_B [ 0 ] > interval_A [ 1 ] :
return [ ]
# сумма интервалов: наименьшее начало из А и Б, и наибольший конец
# сумма интервалов: берем наименьшее начало из А и Б, и наибольший конец
# из А и Б
interval_begin = min ( interval_A [ 0 ] , interval_B [ 0 ] )
interval_end = max ( interval_A [ 1 ] , interval_B [ 1 ] )
@ -146,8 +141,8 @@ def get_union_of_partly_intersecting_intervals(interval_A, interval_B) -> list:
def get_extended_intervals ( intervals ) - > list :
""" Возвращает расширенные интервалы из списка интервалов.
Расширенный интервал , это интервал , который есть сумма двух
пересекающихся ине трвалов . """
Расширенный интервал - - это интервал , который есть сумма двух
пересекающихся инте рвалов . """
extended_intervals = [
get_union_of_partly_intersecting_intervals ( interval , intervals [ k ] )
for i , interval in enumerate ( intervals )
@ -157,12 +152,16 @@ def get_extended_intervals(intervals) -> list:
# список extended_intervals может содержать дублирующиеся
# интервалы из списка intervals, поэтому мы возвращаем только
# отсутствующие в intevals значения
# отсутствующие в inter vals значения
uniq_extended_intervals = [ i for i in extended_intervals if i not in intervals ]
return uniq_extended_intervals
def get_intersection ( interval_A , interval_B ) - > list :
""" Возвращает пересечение двух интервалов.
Пересечение двух интервалов - - это наибольшее из начал A и B , и
наименьшее из концов A и B . """
# если один из интервалов пустой, то пересечение будет пустым
if not interval_A or not interval_B :
return [ ]
@ -178,7 +177,7 @@ def get_intersection(interval_A, interval_B) -> list:
if interval_A [ 0 ] > interval_B [ 1 ] or interval_B [ 0 ] > interval_A [ 1 ] :
return [ ]
# начало интервала это наименьший из начал интервалов А и Б
# начало интервала это наименьшее из начал интервалов А и Б
# конец интервала это наименьший из концов интервалов А и Б
interval_begin = max ( interval_A [ 0 ] , interval_B [ 0 ] )
interval_end = min ( interval_A [ 1 ] , interval_B [ 1 ] )
@ -218,8 +217,10 @@ def appearance(intervals) -> int:
get_intersection ( pol , t ) for t in tutor for pol in pupil_on_lesson
]
# создаем список из продолжительности каждого интервала, если он
# не пустой, а затем суммируем все элементы
# на данном этапе мы уже имеем интересующие нас интервалы
# (пересечение ученик-учитель-урок); остается узнать
# продолжительность каждого из этих интервалов в секундах и
# сложить их.
answer = sum ( [ intr [ 1 ] - intr [ 0 ] for intr in tutor_on_pupil if intr ] )
return answer