diff --git a/task_3.py b/task_3.py index 9953950..802e1cc 100644 --- a/task_3.py +++ b/task_3.py @@ -69,6 +69,55 @@ tests = [ ] +def absorb_small_included_intervals(intervals: list) -> list: + # задача -- поглотить маленькие интервалы, входящие в большие, + # чтобы не было полностю пересекающихся интервалов + pass + + +def remove_small_intervals_in_bigger_intervals(interval_A, interval_B) -> list: + if interval_A[0] < interval_B[0] and interval_A[1] > interval_B[1]: + return interval_A + + if interval_B[0] < interval_A[0] and interval_B[1] > interval_A[1]: + return interval_B + + +def find_inner_sum_of_intersections(interval_A, interval_B) -> list: + print(f"{interval_A=}") + print(f"{interval_B=}") + + # проверить, может быт интервалы входят друг в друга, и тогда + # возвращаем больший + if interval_A[0] < interval_B[0] and interval_A[1] > interval_B[1]: + return interval_A + + if interval_B[0] < interval_A[0] and interval_B[1] > interval_A[1]: + return interval_B + + if interval_A[0] == interval_B[0] and interval_A[1] == interval_B[1]: + return [] + # если один из интервалов пустой, то пересечение будет пустым + if not interval_A or not interval_B: + return [] + + # если какой-то из инетрвалов имеет нулевую длину (начало=конец), + # то пересечение пустое + if interval_A[0] == interval_A[1] or interval_B[0] == interval_B[1]: + return [] + + # нужно проверить, что интервалы вообще пересекаются + # А и B не пересекаются, если + # начало А > конец B, или если начало B > конец А + 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]) + return [interval_begin, interval_end] + + def find_intersection(interval_A, interval_B) -> list: # если один из интервалов пустой, то пересечение будет пустым if not interval_A or not interval_B: @@ -121,26 +170,39 @@ def enlarge_elapsed_intervals(intervals): def appearance(intervals): lesson = intervals["lesson"] - pupil = intervals["pupil"] - tutor = intervals["tutor"] - pupil2 = [pupil[i : i + 2] for i in range(0, len(pupil), 2)] - # print(f"{pupil2=}") - # pupil2 = enlarge_elapsed_intervals(pupil2) + tutor = [ + intervals["tutor"][i : i + 2] for i in range(0, len(intervals["tutor"]), 2) + ] + pupil = [ + intervals["pupil"][i : i + 2] for i in range(0, len(intervals["pupil"]), 2) + ] + + pupil_summs = [] + for i in range(len(pupil)): + for k in range(i, len(pupil)): + a = find_inner_sum_of_intersections(pupil[i], pupil[k]) + pupil_summs.append(a) + pupil_summs = [p for p in pupil_summs if p] + print(f"{pupil_summs=}") + + pupil.extend(pupil_summs) + + pupil = enlarge_elapsed_intervals(pupil) + + print(f"!!!{pupil=}") - enlarge_elapsed_intervals(test) + tutor = enlarge_elapsed_intervals(tutor) # получаем все интервалы студента на уроке pupil_on_lesson = [ - find_intersection(lesson, pupil[i : i + 2]) for i in range(0, len(pupil), 2) + find_intersection(lesson, p) for p in pupil if find_intersection(lesson, p) ] print(f"{pupil_on_lesson=}") # по очереди сравниваем каждый из интервалов преподавателя с # каждым из интервалов пересечения студента на уроке tutor_on_pupil = [ - find_intersection(pol, tutor[i : i + 2]) - for i in range(0, len(tutor), 2) - for pol in pupil_on_lesson + find_intersection(pol, t) for t in tutor for pol in pupil_on_lesson ] print(f"{tutor_on_pupil=}")