From 7202f01dc3416ac218c21a77a1e62c1610476d77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Fri, 15 Jul 2022 16:56:44 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D1=85=D0=BE=D0=B4=D0=B8?= =?UTF-8?q?=D1=82=20=D1=82=D0=B5=D1=81=D1=82=D1=8B,=20=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=B0=D0=B5=D1=82.=20=D0=9D=D1=83=D0=B6=D0=B5?= =?UTF-8?q?=D0=BD=20=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D0=BD=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- task_3.py | 60 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 11 deletions(-) diff --git a/task_3.py b/task_3.py index 295dd58..e3385f2 100644 --- a/task_3.py +++ b/task_3.py @@ -108,6 +108,54 @@ def absorb_small_included_intervals(intervals: list) -> list: return result +def extend_partial_included_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 [] + + # нужно проверить, что интервалы вообще пересекаются + # А и 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]) + print(f"get: {[interval_A, interval_B]}") + print(f"res: {[interval_begin, interval_end]}") + return [interval_begin, interval_end] + + +def extend_intervals(intervals) -> list: + extended_intervals = [ + extend_partial_included_intervals(interval, intervals[k]) + for i, interval in enumerate(intervals) + for k in range(i + 1, len(intervals)) + if extend_partial_included_intervals(interval, intervals[k]) + ] + print(f"{extended_intervals=}") + + uniq_extended_intervals = [i for i in extended_intervals if i not in intervals] + print(f"{uniq_extended_intervals=}") + + result = intervals + uniq_extended_intervals + result = absorb_small_included_intervals(result) + return result + + def find_inner_sum_of_intersections(interval_A, interval_B) -> list: print(f"{interval_A=}") print(f"{interval_B=}") @@ -202,17 +250,7 @@ def appearance(intervals): 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) + pupil = extend_intervals(pupil) print(f"!!!{pupil=}")