Skip to content

Instantly share code, notes, and snippets.

@zonble
Created July 17, 2018 12:30
Show Gist options
  • Save zonble/564afc3ff7ad2d8de92a55e98f6f50f3 to your computer and use it in GitHub Desktop.
Save zonble/564afc3ff7ad2d8de92a55e98f6f50f3 to your computer and use it in GitHub Desktop.
class Range(object):
'An object with a start and a length.'
def __init__(self, start, length):
self.start = start
self.length = length
def contains(self, another):
'If the range contains another range.'
return another.start >= self.start and \
another.start < self.start + self.length
def merge(self, another):
'Merge another range.'
self.start = min(self.start, another.start)
self.length = max(self.start + self.length,
another.start + another.length) - self.start
def solve(data):
ranges = [Range(x[0], x[1]) for x in data]
results = []
buffer = None
for aRange in ranges:
if buffer == None:
buffer = aRange
continue
if buffer.contains(aRange):
buffer.merge(aRange)
else:
results.append(buffer)
buffer = aRange
if buffer != None:
results.append(buffer)
return [(x.start, x.length) for x in results]
if __name__ == '__main__':
results = solve([])
assert(results == [])
results = solve([(1, 1)])
assert(results == [(1, 1)])
results = solve([(1, 1), (3, 2)])
assert(results == [(1, 1), (3, 2)])
results = solve([(1, 4), (2, 5)])
assert(results == [(1, 6)])
results = solve([(1, 4), (2, 5), (7, 4), (8, 5)])
assert(results == [(1, 6), (7, 6)])
results = solve([(1, 4), (2, 5), (6, 4), (8, 5)])
assert(results == [(1, 12)])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment