2016-04-09 24 views
0

Ich habe eine Zuordnung, für die ich einen Algorithmus schreiben muss, der die L-Zeilen der Conway-Sequenz einer ausgewählten r-Zahl generiert. Beispiel für L = 8 und r = 1:Conway-Sequenz in Python

1 
1 1 
2 1 
1 2 1 1 
1 1 1 2 2 1 
3 1 2 2 1 1 
1 3 1 1 2 2 2 1 
1 1 1 3 2 1 3 2 1 1 

habe ich versucht, einen Algorithmus in Python3 zu schreiben, aber ich kann nicht die korrekte Ausgabe erhalten verwalten. Ich würde schätzen, wenn Sie mir helfen könnte, um herauszufinden, was los ist ... Wie auch immer, hier ist was ich bisher geschrieben:

r = int(input()) 
l = int(input()) 

cur=str(r).strip() 
print(r) 
for j in range(l-1): 
    r=cur 
    cur="" 
    i=0 
    while i<len(r) : 
     c=1 #counts the consecutive same "numbers" 
     while ((i+c*2)<len(r)) and (r[i]==r[i+c*2]): 
      c+=1 
     cur+=str(c)+" "+r[i]+" " 
     i+=c+1 
    cur=cur.strip() 
    print(cur) 

Und das ist der Ausgang ich für l bekommen = 8 und r = 1:

1 
1 1 
2 1 
1 2 1 1 
1 1 1 2 2 1 
3 1 1 1 2 2 1 
1 3 3 1 1 1 2 2 1 
1 1 2 3 6 2 2 1 

ich glaube auch, dass mein Code ziemlich hässlich, so fühlen sich frei, ist Ihre Bemerkungen

+0

Sie machen viele unnötige Castings/Konvertierungen zwischen 'int' und' str'. 'input()' gibt eine Zeichenkette zurück. Diese Zeichenfolge wird dann in eine Ganzzahl konvertiert und in "r" gespeichert. Der Wert von "r" wird dann wieder in eine Zeichenkette umgewandelt und in "cur" gespeichert. 'r' (welches immer noch eine ganze Zahl ist) wird dann durch 'cur' überschrieben, was' r' und' cur' zur selben Zeichenkette macht (so ist 'r' nun keine ganze Zahl mehr). – jDo

Antwort

0

wirklich zu geben, ist groupby dafür gebaut:

from itertools import groupby 

def lookandsay(i): 
    digits = str(i) #convert to string 
    newdigits = [] 
    for k, g in groupby(digits): 
     newdigits += [sum(1 for _ in g), k] 
    return int("".join(map(str, newdigits))) 

def conway(i): 
    yield i 
    while True: 
     i = lookandsay(i) 
     yield i 

cw01 = conway(1) 
for _ in range(8): 
    print(" ".join(str(next(cw01))))