Home > Net >  Extending an interval for the length of any interruption until its original length is reached
Extending an interval for the length of any interruption until its original length is reached

Time:05-28

Let's say I have the following interval, stored as a list:

main_iv = [10, 30]

and the following intervals which interrupt (overlap) the interval above:

break_iv = [[8, 12], [15, 18], [32, 40], [42, 43]]

I would like to extend main_iv until it has reached its original length entirely (20), again taking into acount any interruptions that occur during the extension.

I have working code for the first interruption but I really struggle to find a way to make this work continously and dynamically for an unspecified amount of interruptions.

def overlap_calc(start_1, start_2, end_1, end_2):
        latest_start = max(start_1, start_2)
        earliest_end = min(end_1, end_2)
        delta = (earliest_end - latest_start)   1
        overlap = max(0, delta)
        return(overlap)

main_iv = [10, 30]

break_iv = [[8, 12], [15, 18], [32, 40]]

overlap = 0
for sub_iv in break_iv:
    overlap  = overlap_calc(main_iv[0], sub_iv[0], main_iv[1], sub_iv[1])

main_iv[1] = main_iv[1]   overlap

print(main_iv)

This gives the following output, which takes into account the overlap [8, 12] (overlap of 3) and [15, 18] (overlap of 4):

[10, 37]

However, taking into acount the interval [32, 40] again overlapping with the extension (running from 31 to 37), the original interval can only be completed after 40. The indended output would therefore look like this:

[10, 46]

CodePudding user response:

If I understand your problem correctly, you could do something like this.

def solve(main, gaps):
    start, end = main
    for lo, hi in gaps:
        if hi < start:
            # gap is lower than main
            continue
        if lo > end:
            # gap is higher than main
            break
        # extend main end by overlap length
        overlap_length = hi   1 - max(lo, start)
        end  = overlap_length
        
    return [start, end]

This gives the expected result, assuming that there are no overlaps between the gaps, and the gaps are in ascending order.

>>> solve(main=(10,30), gaps=[(8,12), (15,18), (32,40)])
[10, 46]
  • Related