45 lines
1.1 KiB
Python
45 lines
1.1 KiB
Python
|
#!/usr/bin/env python
|
||
|
|
||
|
samples = [ [[[1,3],[3,6]],5], [[[10,14],[4,18],[19,20],[19,20],[13,20]],16] ]
|
||
|
|
||
|
def answer(intervals):
|
||
|
"""Calculate the total number of units covered by the supplied collection of intervals"""
|
||
|
while True:
|
||
|
changed, intervals = iterate(intervals)
|
||
|
if not changed:
|
||
|
break
|
||
|
|
||
|
covered = 0
|
||
|
for interval in intervals:
|
||
|
covered += interval[1] - interval[0]
|
||
|
|
||
|
return covered
|
||
|
|
||
|
def iterate(intervals):
|
||
|
ranges = [intervals.pop(0)]
|
||
|
changed = False
|
||
|
while (len(intervals)>0):
|
||
|
interval = intervals.pop()
|
||
|
merged = False
|
||
|
for i in range(0,len(ranges)):
|
||
|
if overlaps(interval,ranges[i]):
|
||
|
ranges[i] = merge(ranges[i],interval)
|
||
|
merged = True
|
||
|
changed = True
|
||
|
if not merged:
|
||
|
ranges.append(interval)
|
||
|
return changed, ranges
|
||
|
|
||
|
def overlaps(a,b):
|
||
|
if (a[0]<b[1]) and (a[1]>b[0]):
|
||
|
return True
|
||
|
else:
|
||
|
return False
|
||
|
|
||
|
def merge(a,b):
|
||
|
return [min(a[0],b[0]),max(a[1],b[1])]
|
||
|
|
||
|
for sample in samples:
|
||
|
print answer(sample[0])
|
||
|
print sample[1]
|