|
|
@ -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: |
|
|
|
def find_intersection(interval_A, interval_B) -> list: |
|
|
|
# если один из интервалов пустой, то пересечение будет пустым |
|
|
|
# если один из интервалов пустой, то пересечение будет пустым |
|
|
|
if not interval_A or not interval_B: |
|
|
|
if not interval_A or not interval_B: |
|
|
@ -121,26 +170,39 @@ def enlarge_elapsed_intervals(intervals): |
|
|
|
|
|
|
|
|
|
|
|
def appearance(intervals): |
|
|
|
def appearance(intervals): |
|
|
|
lesson = intervals["lesson"] |
|
|
|
lesson = intervals["lesson"] |
|
|
|
pupil = intervals["pupil"] |
|
|
|
tutor = [ |
|
|
|
tutor = intervals["tutor"] |
|
|
|
intervals["tutor"][i : i + 2] for i in range(0, len(intervals["tutor"]), 2) |
|
|
|
pupil2 = [pupil[i : i + 2] for i in range(0, len(pupil), 2)] |
|
|
|
] |
|
|
|
# print(f"{pupil2=}") |
|
|
|
pupil = [ |
|
|
|
# pupil2 = enlarge_elapsed_intervals(pupil2) |
|
|
|
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 = [ |
|
|
|
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=}") |
|
|
|
print(f"{pupil_on_lesson=}") |
|
|
|
|
|
|
|
|
|
|
|
# по очереди сравниваем каждый из интервалов преподавателя с |
|
|
|
# по очереди сравниваем каждый из интервалов преподавателя с |
|
|
|
# каждым из интервалов пересечения студента на уроке |
|
|
|
# каждым из интервалов пересечения студента на уроке |
|
|
|
tutor_on_pupil = [ |
|
|
|
tutor_on_pupil = [ |
|
|
|
find_intersection(pol, tutor[i : i + 2]) |
|
|
|
find_intersection(pol, t) for t in tutor for pol in pupil_on_lesson |
|
|
|
for i in range(0, len(tutor), 2) |
|
|
|
|
|
|
|
for pol in pupil_on_lesson |
|
|
|
|
|
|
|
] |
|
|
|
] |
|
|
|
print(f"{tutor_on_pupil=}") |
|
|
|
print(f"{tutor_on_pupil=}") |
|
|
|
|
|
|
|
|
|
|
|