""" Some versions of the "Look and Say" sequence, you can find it into the The On-Line Encyclopedia of Integer Sequences, as sequence A005150: http://www.research.att.com/~njas/sequences/A005150 V1.1, by leonardo maffi, Dec 24 2006 """ # http://www.research.att.com/~njas/sequences/A005150 # Short self-contained version from itertools import groupby def A005150a(n, s=(1,)): for i in range(n-1): s+= (int("".join( `len(list(g))`+str(h) for h,g in groupby(str(s[-1])) )),) return s # Generator version from itertools import groupby def A005150b(n, s=1): yield s for i in range(n-1): s = int("".join( `len(list(g))`+str(h) for h,g in groupby(str(s)) )) yield s # Infinite generator version from itertools import groupby def A005150c(s=1): yield s while True: s = int("".join( `len(list(g))`+str(h) for h,g in groupby(str(s)) )) yield s def A005150d(n): # faster uncompiled strl = {("1","1","1"): "31", ("1","1"): "21", ("1",): "11", ("2","2","2"): "32", ("2","2"): "22", ("2",): "12", ("3","3","3"): "33", ("3","3"): "23", ("3",): "13" } result = [1] prec = "1" for i in xrange(n-1): prec = "".join( strl[tuple(l)] for e,l in groupby(prec) ) result.append( int(prec) ) return result def A005150e(n): # faster compiled with Psyco strl = {("1","1","1"): "31", ("1","1"): "21", ("1",): "11", ("2","2","2"): "32", ("2","2"): "22", ("2",): "12", ("3","3","3"): "33", ("3","3"): "23", ("3",): "13" } s = [1] prec = str(s[-1]) for i in xrange(n-1): r = [] for e,l in groupby(prec): r.append( strl[tuple(l)] ) prec = "".join(r) s.append( int(prec) ) return s try: import psyco psyco.bind(A005150e) except ImportError: pass # Short version that uses nestlist from itertools import groupby f = lambda s: int("".join( `len(list(g))`+str(h) for h,g in groupby(str(s)) )) A005150f = lambda n: nestlist(f, n-1, 1) # Shorter version that uses nestlist import itertools as i;A=lambda n:nestlist(lambda s:int("".join(`len(list(g))`+str(h)for h,g in i.groupby(str(s)))),n-1,1) # Where: def nestlist(f, n, seed): result = [seed] for i in xrange(n): result.append( f(result[-1]) ) return result from itertools import islice print A005150a(15), "\n" print list(A005150b(15)), "\n" print list(islice(A005150c(), 15)), "\n" print A005150d(15), "\n" print A005150e(15), "\n" print A005150f(15), "\n" print A(15) print "----------------------------" print "Few timings:" from time import clock n = 32 t = clock() A005150a(n) print round(clock() - t, 2) t = clock() A005150d(n) print round(clock() - t, 2) t = clock() A005150e(n) # With psyco print round(clock() - t, 2)