import itertools
def resetable_counter(start):
while True:
for i in itertools.count(start):
reset = yield i
if reset:
start = reset
break
def ranges(seq):
start, end = seq[0], seq[0]
counter = resetable_counter(start)
for count, item in zip(counter, seq):
if not count == item:
yield start, end
start, end = item, item
counter.send(item)
end = item
yield start, end
print(list(ranges([1,2,3,4,5,8,9,10,11,200,201,202])))
aW1wb3J0IGl0ZXJ0b29scwoKZGVmIHJlc2V0YWJsZV9jb3VudGVyKHN0YXJ0KToKICAgIHdoaWxlIFRydWU6CiAgICAgICAgZm9yIGkgaW4gaXRlcnRvb2xzLmNvdW50KHN0YXJ0KToKICAgICAgICAgICAgcmVzZXQgPSB5aWVsZCBpCiAgICAgICAgICAgIGlmIHJlc2V0OgogICAgICAgICAgICAgICAgc3RhcnQgPSByZXNldAogICAgICAgICAgICAgICAgYnJlYWsKCmRlZiByYW5nZXMoc2VxKToKICAgIHN0YXJ0LCBlbmQgPSBzZXFbMF0sIHNlcVswXQogICAgY291bnRlciA9IHJlc2V0YWJsZV9jb3VudGVyKHN0YXJ0KQogICAgZm9yIGNvdW50LCBpdGVtIGluIHppcChjb3VudGVyLCBzZXEpOgogICAgICAgIGlmIG5vdCBjb3VudCA9PSBpdGVtOgogICAgICAgICAgICB5aWVsZCBzdGFydCwgZW5kCiAgICAgICAgICAgIHN0YXJ0LCBlbmQgPSBpdGVtLCBpdGVtCiAgICAgICAgICAgIGNvdW50ZXIuc2VuZChpdGVtKQogICAgICAgIGVuZCA9IGl0ZW0KICAgIHlpZWxkIHN0YXJ0LCBlbmQKCnByaW50KGxpc3QocmFuZ2VzKFsxLDIsMyw0LDUsOCw5LDEwLDExLDIwMCwyMDEsMjAyXSkpKQo=
[(1, 5), (8, 8), (9, 9), (10, 10), (11, 11), (200, 200), (201, 201), (202, 202)]