|
|
@ -108,6 +108,54 @@ def absorb_small_included_intervals(intervals: list) -> list: |
|
|
|
return result |
|
|
|
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: |
|
|
|
def find_inner_sum_of_intersections(interval_A, interval_B) -> list: |
|
|
|
print(f"{interval_A=}") |
|
|
|
print(f"{interval_A=}") |
|
|
|
print(f"{interval_B=}") |
|
|
|
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) |
|
|
|
intervals["pupil"][i : i + 2] for i in range(0, len(intervals["pupil"]), 2) |
|
|
|
] |
|
|
|
] |
|
|
|
|
|
|
|
|
|
|
|
pupil_summs = [] |
|
|
|
pupil = extend_intervals(pupil) |
|
|
|
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=}") |
|
|
|
print(f"!!!{pupil=}") |
|
|
|
|
|
|
|
|
|
|
|