2010-11-10 4 views
2

Je travaille actuellement sur un devoir pour générer ce qui est connu sous le nom de Pascal's triangle en Python.Formatage du triangle de Pascal

Jusqu'à présent, voici ce que j'ai:

def mytri(myrange): 
    trianglevar = [[1]] 
    for i in range(1, myrange): 
     tempvar = [1] 
     for n in range(0, i-1): 
      tempvar.append(trianglevar[i-1][n]+trianglevar[i-1][n+1]) 
     tempvar.append(1) 
     trianglevar.append(tempvar) 
    return trianglevar 

def mymenu(): 
    for i in mytri(int(raw_input("Please enter the height of the triangle: "))): 
     print i 
    print '\n' 
    choicevar = raw_input("Would you like to create another triangle? (y/n): ") 
    if choicevar == "y": 
     mymenu() 
    else: 
     print "Goodbye." 

mymenu() 

Ce que le programme fait jusqu'à ce point effectuer le calcul pour le triangle. Il calcule les nombres dans chaque ligne (commençant par 1), et s'arrête après avoir atteint le nombre de lignes spécifié par l'utilisateur.

Cependant, je ne suis pas sûr comment formater mon triangle. Il imprime actuellement:

[1] 
[1, 1] 
[1, 2, 1] 
[1, 3, 3, 1] 
[1, 4, 6, 4, 1] 
...etc. 

La sortie que je veux est:

 [1] 
     [1, 1] 
    [1, 2, 1] 
    [1, 3, 3, 1] 
[1, 4, 6, 4, 1] 
...etc. 

(Il est un peu hors du fait des supports/virgules, mais je suis juste essayer d'obtenir le format général en bas à droite maintenant.)

Merci pour votre aide, vous pouvez offrir!

Répondre

1
h = int(raw_input("Please enter the height of the triangle: ")) 
for i in mytri(h): 
    print " " * (h * 2), i 
    h -= 1 

Voici donc l'impression 2 espaces pour chaque niveau de pyramide. La première ligne est décalée de deux fois le nombre d'espaces. Comme vous la descente d'un niveau, vous diminuez par indentation 2.

+0

Est-ce destiné à remplacer pour i dans mytri (int (raw_input ("S'il vous plaît entrer la hauteur du triangle:"))): imprimer i Ou est destiné à être placé ailleurs dans le programme? –

+0

Cela suppose de remplacer les deux premières lignes de la fonction mymenu. – cababunga

1

Voici quelques conseils. Essayez:

' ' * someNumber

pour l'espacement. Si vous ne voulez pas les crochets de la liste, vous pouvez faire une boucle sur la ligne:

for el in i: 
    # Write el as you want 

ou utilisez join.

Vous pouvez également trouver enumerate utile pour obtenir des indices (par exemple pour l'espacement).

1

Une fois que vous avez vos lignes, vous aurez probablement la dernière rangée comme la plus longue.

Depuis que vous venez de les imprimer, vous pouvez prendre le l = len(str(rows[-1])) puis le combiner avec un str(rows[i]).center(l) pour chaque ligne.

EDIT: ne savais pas que nous devrions donner toutes les réponses aux devoirs ... Si oui:

def mytri(myrange): 
    rows = list() 
    lr = None # Last row 

    for i in xrange(myrange+1): 
     try: 
      lr = [1] + [lr[i] + lr[i+1] for i in range(len(lr) - 1)] + [1] 
     except TypeError: 
      lr = [1] 
     #rows.append(str(lr)) 
     rows.append(' '.join(str(v) for v in lr)) 
    return rows 

rows = mytri(10) 
l = len(rows[-1]) 
print '\n'.join(v.center(l) for v in rows) 

génèrerait

 
       1     
       1 1     
       1 2 1    
       1 3 3 1    
      1 4 6 4 1    
      1 5 10 10 5 1   
      1 6 15 20 15 6 1   
     1 7 21 35 35 21 7 1   
     1 8 28 56 70 56 28 8 1  
    1 9 36 84 126 126 84 36 9 1  
1 10 45 120 210 252 210 120 45 10 1 
0

au lieu de régénérer les lignes précédentes à chaque itération, vous pouvez produire chaque ligne que vous générez:

def mytri(height): 
    start = [1] 
    for _ in xrange(height): # "_" for an unused variable 
    yield start # loop written "backwards" for simplicity, 
    # though this does generate one unused row 
    next_row = [1] 
    for a, b in zip(start, start[1:]): # slicing creates a new list, not a 
     next_row.append(a + b)   # concern for this problem, but in 
    next_row.append(1)     # others you could use itertools.islice 
    start = next_row     # to avoid that 

énumèrent maintenant la hauteur vers l'arrière avec Chaque rangée:

height = int(raw_input("Height: ")) 
for n, row in zip(xrange(height - 1, -1, -1), mytri(height)): 
    print " " * n, " ".join("%5d" % x for x in row) 

Ceci ne s'alignera pas rapidement avec beaucoup de rangées, mais cela devrait vous mener dans la bonne direction.

0

Vous devez pad tous les numéros de sorte qu'ils sont de la même largeur
Vous devez également ajouter un peu de rembourrage sur le côté gauche

def mymenu(): 
    res = mytri(int(raw_input("Please enter the height of the triangle: "))) 
    width = len(str(res[-1][len(res[-1])/2])) 
    for i, row in enumerate(res): 
     print " "*(width*(len(res)-i)/2)+" ".join(str(x).rjust(width) for x in row) 
    print '\n' 
    choicevar = raw_input("Would you like to create another triangle? (y/n): ") 
    if choicevar == "y": 
     mymenu() 
    else: 
     print "Goodbye." 

sortie:

Please enter the height of the triangle: 10 
       1 
       1 1 
      1 2 1 
      1 3 3 1 
      1 4 6 4 1 
     1 5 10 10 5 1 
     1 6 15 20 15 6 1 
    1 7 21 35 35 21 7 1 
    1 8 28 56 70 56 28 8 1 
    1 9 36 84 126 126 84 36 9 1 
0
n=input('enter n:') 
z=0 
d=' ' 
while z<n: 
     d=d+' ' 
     z=z+1 
print d,1 
l1=[1] 
l2=[1,1] 
def space(n,a): 
     s='' 
     while a<n: 
     s=s+' ' 
     a=a+1 
     return s 
def digit(n): 
     r=1 
     k=0 
     while r!=0: 
      r=n/10**k 
      k=k+1 
     return k-1 
def print_l(l1,b): 
     d='' 
     d='\n'+space(b-1,0)*3 
     i=0 
     while i<len(l1): 
      d=d+' '*(6-digit(l1[i]))+str(l1[i]) 
      i=i+1 
     print d 
b=n-1 
k=1 
while k<n: 
     l2=l1 
     l1=[1] 
     i=1 
     while len(l1)<len(l2): 
      if i>len(l2)/2: 
       l1.append(l1[len(l2)-i]) 
      else: 
       l1.append(l2[i-1]+l2[i]) 
      i=i+1 
     k=k+1 
     l1.append(1) 
     print_l(l1,b) 
     b=b-1