Browse Source

Рабочая копия

master
Дмитрий 3 years ago
parent
commit
0bb15dd1ee
  1. 82
      task_3.py

82
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: 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=}")

Loading…
Cancel
Save