You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
3.5 KiB
104 lines
3.5 KiB
"""Задание на расчет интервалов, и вычисление времени, которое ученик |
|
и учитель присутствовали на уроке одновременно.""" |
|
from intervals_cleaning import normilize_intervals |
|
from intervals_intersection import get_all_intersections |
|
|
|
tests = [ |
|
{ |
|
"data": { |
|
"lesson": [1594663200, 1594666800], |
|
"pupil": [ |
|
1594663340, |
|
1594663389, |
|
1594663390, |
|
1594663395, |
|
1594663396, |
|
1594666472, |
|
], |
|
"tutor": [1594663290, 1594663430, 1594663443, 1594666473], |
|
}, |
|
"answer": 3117, |
|
}, |
|
{ |
|
"data": { |
|
"lesson": [1594702800, 1594706400], |
|
"pupil": [ |
|
1594702789, |
|
1594704500, |
|
1594702807, |
|
1594704542, |
|
1594704512, |
|
1594704513, |
|
1594704564, |
|
1594705150, |
|
1594704581, |
|
1594704582, |
|
1594704734, |
|
1594705009, |
|
1594705095, |
|
1594705096, |
|
1594705106, |
|
1594706480, |
|
1594705158, |
|
1594705773, |
|
1594705849, |
|
1594706480, |
|
1594706500, |
|
1594706875, |
|
1594706502, |
|
1594706503, |
|
1594706524, |
|
1594706524, |
|
1594706579, |
|
1594706641, |
|
], |
|
"tutor": [ |
|
1594700035, |
|
1594700364, |
|
1594702749, |
|
1594705148, |
|
1594705149, |
|
1594706463, |
|
], |
|
}, |
|
"answer": 3577, |
|
}, |
|
{ |
|
"data": { |
|
"lesson": [1594692000, 1594695600], |
|
"pupil": [1594692033, 1594696347], |
|
"tutor": [1594692017, 1594692066, 1594692068, 1594696341], |
|
}, |
|
"answer": 3565, |
|
}, |
|
] |
|
|
|
|
|
def appearance(intervals) -> int: |
|
"""Возвращает время одновременного присутствия ученика и учителя на |
|
уроке в секундах.""" |
|
lesson = intervals["lesson"] |
|
pupil = normilize_intervals(intervals["pupil"]) |
|
tutor = normilize_intervals(intervals["tutor"]) |
|
|
|
# получаем все интервалы студента на уроке |
|
pupil_on_lesson = get_all_intersections(pupil, [lesson]) |
|
|
|
# по очереди сравниваем каждый из интервалов преподавателя с |
|
# каждым из интервалов пересечения студента на уроке |
|
tutor_on_pupil = get_all_intersections(pupil_on_lesson, tutor) |
|
|
|
# на данном этапе мы уже имеем интересующие нас интервалы |
|
# (пересечение ученик-учитель-урок); остается узнать |
|
# продолжительность каждого из этих интервалов в секундах и |
|
# сложить их. |
|
answer = sum([intr[1] - intr[0] for intr in tutor_on_pupil if intr]) |
|
return answer |
|
|
|
|
|
if __name__ == "__main__": |
|
for i, test in enumerate(tests): |
|
test_answer = appearance(test["data"]) |
|
assert ( |
|
test_answer == test["answer"] |
|
), f'Error on test case {i}, got {test_answer}, expected {test["answer"]}'
|
|
|