I tried with particular cases of presence of (45, 46) and (45, 45)
and also test cases that are unlikely to happen in your application: presence of (11,6), presence of (-1, -5), presence of (-9, 5), presence of (-3, 10).
Anyway the results are right for all these cases, it's a point.
The algorithm:
def yi(li):
gen = (x for a,b in li for x in xrange(a,b+1))
start = p = gen.next()
for x in gen:
if x>p+2:
yield (start,p)
start = p = x
else:
p = x
yield (start,x)
If aff
in the following code is set to True, the steps of the execution are displayed.
def yi(li):
aff = 0
gen = (x for a,b in li for x in xrange(a,b+1))
start = p = gen.next()
for x in gen:
if aff:
print ('start %s p %d p+2 %d '
'x==%s' % (start,p,p+2,x))
if x>p+2:
if aff:
print 'yield range(%d,%d)' % (start,p+1)
yield (start,p)
start = p = x
else:
p = x
if aff:
print 'yield range(%d,%d)' % (start,x+1)
yield (start,x)
for li in ([(7,10),(23,39),(11,13),(11,15),(14,20),(45,46)],
[(7,10),(23,39),(11,13),(11,15),(14,20),(45,46),(45,45)],
[(7,10),(23,39),(11,13),(11,15),(14,20),(45,45)],
[(7,10),(23,39),(11,13),(11,6),(14,20),(45,46)],
#1 presence of (11, 6)
[(7,10),(23,39),(11,13),(-1,-5),(14,20),(45,45)],
#2 presence of (-1,-5)
[(7,10),(23,39),(11,13),(-9,-5),(14,20),(45,45)],
#3 presence of (-9, -5)
[(7,10),(23,39),(11,13),(-3,10),(14,20),(45,45)]):
#4 presence of (-3, 10)
li.sort()
print 'sorted li %s'%li
print '\n'.join(' (%d,%d) %r' % (a,b,range(a,b))
for a,b in li)
print 'list(yi(li)) %s\n' % list(yi(li))
result
sorted li [(7, 10), (11, 13), (11, 15), (14, 20),
(23, 39), (45, 46)]
(7,10) [7, 8, 9]
(11,13) [11, 12]
(11,15) [11, 12, 13, 14]
(14,20) [14, 15, 16, 17, 18, 19]
(23,39) [23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
35, 36, 37, 38]
(45,46) [45]
list(yi(li)) [(7, 20), (23, 39), (45, 46)]
sorted li [(7, 10), (11, 13), (11, 15), (14, 20),
(23, 39), (45, 45), (45, 46)]
(7,10) [7, 8, 9]
(11,13) [11, 12]
(11,15) [11, 12, 13, 14]
(14,20) [14, 15, 16, 17, 18, 19]
(23,39) [23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
35, 36, 37, 38]
(45,45) []
(45,46) [45]
list(yi(li)) [(7, 20), (23, 39), (45, 46)]
sorted li [(7, 10), (11, 13), (11, 15), (14, 20),
(23, 39), (45, 45)]
(7,10) [7, 8, 9]
(11,13) [11, 12]
(11,15) [11, 12, 13, 14]
(14,20) [14, 15, 16, 17, 18, 19]
(23,39) [23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
35, 36, 37, 38]
(45,45) []
list(yi(li)) [(7, 20), (23, 39), (45, 45)]
sorted li [(7, 10), (11, 6), (11, 13), (14, 20),
(23, 39), (45, 46)]
(7,10) [7, 8, 9]
(11,6) []
(11,13) [11, 12]
(14,20) [14, 15, 16, 17, 18, 19]
(23,39) [23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
35, 36, 37, 38]
(45,46) [45]
list(yi(li)) [(7, 20), (23, 39), (45, 46)]
sorted li [(-1, -5), (7, 10), (11, 13), (14, 20),
(23, 39), (45, 45)]
(-1,-5) []
(7,10) [7, 8, 9]
(11,13) [11, 12]
(14,20) [14, 15, 16, 17, 18, 19]
(23,39) [23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
35, 36, 37, 38]
(45,45) []
list(yi(li)) [(7, 20), (23, 39), (45, 45)]
sorted li [(-9, -5), (7, 10), (11, 13), (14, 20),
(23, 39), (45, 45)]
(-9,-5) [-9, -8, -7, -6]
(7,10) [7, 8, 9]
(11,13) [11, 12]
(14,20) [14, 15, 16, 17, 18, 19]
(23,39) [23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
35, 36, 37, 38]
(45,45) []
list(yi(li)) [(-9, -5), (7, 20), (23, 39), (45, 45)]
sorted li [(-3, 10), (7, 10), (11, 13), (14, 20),
(23, 39), (45, 45)]
(-3,10) [-3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
(7,10) [7, 8, 9]
(11,13) [11, 12]
(14,20) [14, 15, 16, 17, 18, 19]
(23,39) [23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
35, 36, 37, 38]
(45,45) []
list(yi(li)) [(-3, 20), (23, 39), (45, 45)]