class Range(object):
def __init__(self, begin, end):
self.begin=begin
self.end=end
def __repr__(self):
return "(%d,%d)" %(self.begin, self.end)
def merge_adiacent(ranges, start):
first = ranges[start]
second = ranges[start+1]
if first.end >= second.begin:
ranges[start]=Range(first.begin, first.end if first.end > second.end else second.end)
ranges.pop(start+1)
return True
return False
def compress(ranges_list):
sorted_ranges = sorted(ranges_list, cmp=lambda range1, range2: cmp(range1.begin, range2.begin))
current = 0
for i in range(len(sorted_ranges)-1):
if not merge_adiacent(sorted_ranges, current):
current+=1
return sorted_ranges
def main():
ranges = [Range(5, 8), Range(-3, 2), Range(13, 15), Range(5, 12), Range(6, 7)]
print(compress(ranges))
main()
Y2xhc3MgUmFuZ2Uob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBiZWdpbiwgZW5kKToKICAgICAgICBzZWxmLmJlZ2luPWJlZ2luCiAgICAgICAgc2VsZi5lbmQ9ZW5kCiAKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIiglZCwlZCkiICUoc2VsZi5iZWdpbiwgc2VsZi5lbmQpCiAKZGVmIG1lcmdlX2FkaWFjZW50KHJhbmdlcywgc3RhcnQpOgogICAgZmlyc3QgPSByYW5nZXNbc3RhcnRdCiAgICBzZWNvbmQgPSByYW5nZXNbc3RhcnQrMV0KICAgIGlmIGZpcnN0LmVuZCA+PSBzZWNvbmQuYmVnaW46CiAgICAgICAgcmFuZ2VzW3N0YXJ0XT1SYW5nZShmaXJzdC5iZWdpbiwgZmlyc3QuZW5kIGlmIGZpcnN0LmVuZCA+IHNlY29uZC5lbmQgZWxzZSBzZWNvbmQuZW5kKQogICAgICAgIHJhbmdlcy5wb3Aoc3RhcnQrMSkKICAgICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIEZhbHNlCiAKZGVmIGNvbXByZXNzKHJhbmdlc19saXN0KToKICAgIHNvcnRlZF9yYW5nZXMgPSBzb3J0ZWQocmFuZ2VzX2xpc3QsIGNtcD1sYW1iZGEgcmFuZ2UxLCByYW5nZTI6IGNtcChyYW5nZTEuYmVnaW4sIHJhbmdlMi5iZWdpbikpCiAgICBjdXJyZW50ID0gMCAKICAgIGZvciBpIGluIHJhbmdlKGxlbihzb3J0ZWRfcmFuZ2VzKS0xKToKICAgICAgICBpZiBub3QgbWVyZ2VfYWRpYWNlbnQoc29ydGVkX3JhbmdlcywgY3VycmVudCk6CiAgICAgICAgICAgIGN1cnJlbnQrPTEKICAgIHJldHVybiBzb3J0ZWRfcmFuZ2VzCiAKZGVmIG1haW4oKToKICAgIHJhbmdlcyA9IFtSYW5nZSg1LCA4KSwgUmFuZ2UoLTMsIDIpLCBSYW5nZSgxMywgMTUpLCBSYW5nZSg1LCAxMiksIFJhbmdlKDYsIDcpXQogICAgcHJpbnQoY29tcHJlc3MocmFuZ2VzKSkKIAptYWluKCk=