Source code for kyu_4.sum_of_intervals.sum_of_intervals

"""
Solution for -> Sum of Intervals.

Created by Egor Kostan.
GitHub: https://github.com/ikostan
"""


[docs] def sum_of_intervals(intervals: list) -> int: """ Sum of intervals. Accept an array of intervals, and returns the sum of all the interval lengths. Overlapping intervals should only be counted once. :param intervals: list :return: int """ intervals = remove_overlaps(intervals) results: list = [(i[1] - i[0]) for i in intervals] return sum(results)
[docs] def remove_overlaps(intervals: list) -> list: """ Remove overlaps and duplicates. :param intervals: list :return: int """ is_clean: bool = False while not is_clean: is_clean = True for index_i, i in enumerate(intervals): for index_b, b in enumerate(intervals): if index_b != index_i: is_clean = clean_interval(intervals, i, b) if not is_clean: break return intervals
[docs] def clean_interval(intervals: list, i: tuple, b: tuple) -> bool: """ Remove intervals. :param intervals: list :param i: tuple :param b: tuple :return: bool """ result: bool = True if i[0] == b[0] and i[1] == b[1]: intervals.remove(b) result = False if i[0] < b[0] < i[1] <= b[1]: intervals.append((i[0], b[1])) intervals.remove(i) intervals.remove(b) result = False if b[0] < i[0] < b[1] <= i[1]: intervals.append((b[0], i[1])) intervals.remove(i) intervals.remove(b) result = False if b[0] < i[0] < i[1] < b[1]: intervals.remove(i) result = False if i[0] < b[0] < b[1] < i[1]: intervals.remove(b) result = False if i[0] == b[0] and b[1] < i[1]: intervals.remove(b) result = False if i[0] == b[0] and i[1] < b[1]: intervals.remove(i) result = False return result