pyramid of numbers in python

23,028

Solution 1

Use a leading space for a number ("01" - "09", "10", ...)

num = eval(raw_input("Enter an integer from 1 to 15: "))                                                                                           

def as_str(i):
    s = ""
    if i <10: s = " "
    return s + str(i)


#num = 15                                                                                                                                           

allrows = ""
for j in range(1,num+2):

    #leading spaces                                                                                                                                 
    row = " "*3*(num-j+1)

    #backward                                                                                                                                       
    for i in range(j-1,1,-1):
        s = as_str(i)
        row+=s + " "

    #forward                                                                                                                                        
    for i in range(1,j):
        s = as_str(i)
        row+=s + " "


    row +="\n"
    allrows +=row

print allrows

Output

                                           1 
                                        2  1  2 
                                     3  2  1  2  3 
                                  4  3  2  1  2  3  4 
                               5  4  3  2  1  2  3  4  5 
                            6  5  4  3  2  1  2  3  4  5  6 
                         7  6  5  4  3  2  1  2  3  4  5  6  7 
                      8  7  6  5  4  3  2  1  2  3  4  5  6  7  8 
                   9  8  7  6  5  4  3  2  1  2  3  4  5  6  7  8  9 
               10  9  8  7  6  5  4  3  2  1  2  3  4  5  6  7  8  9 10 
            11 10  9  8  7  6  5  4  3  2  1  2  3  4  5  6  7  8  9 10 11 
         12 11 10  9  8  7  6  5  4  3  2  1  2  3  4  5  6  7  8  9 10 11 12 
      13 12 11 10  9  8  7  6  5  4  3  2  1  2  3  4  5  6  7  8  9 10 11 12 13 

Solution 2

using string formatting, and it works for any value of n>=1:

num=int(raw_input())

max_width=len(" ".join(map(str,range(num,0,-1)))+" ".join(map(str,range(2,num+1))))+1
#max_width is the maximum width, i.e width of the last line

print "{0:^{1}}".format("1",max_width)      #print 1 , ^ is used to place the
                                            #string in the center of the max_width
for i in range(2,num+1):   #print rest of the numbers from 2 to num
    range1=range(i,0,-1)
    strs1=" ".join(map(str,range1))
    range2=range(2,i+1)
    strs2=" ".join(map(str,range2))
    print "{0:^{1}}".format(" ".join((strs1,strs2)),max_width) # use ^ again with max_width

outputs:

monty@monty-Aspire-5050:~$ python so27.py
5
        1        
      2 1 2      
    3 2 1 2 3    
  4 3 2 1 2 3 4  
5 4 3 2 1 2 3 4 5
monty@monty-Aspire-5050:~$ python so27.py
10
                   1                   
                 2 1 2                 
               3 2 1 2 3               
             4 3 2 1 2 3 4             
           5 4 3 2 1 2 3 4 5           
         6 5 4 3 2 1 2 3 4 5 6         
       7 6 5 4 3 2 1 2 3 4 5 6 7       
     8 7 6 5 4 3 2 1 2 3 4 5 6 7 8     
   9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9   
10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10
monty@monty-Aspire-5050:~$ python so27.py
20
                                                 1                                                 
                                               2 1 2                                               
                                             3 2 1 2 3                                             
                                           4 3 2 1 2 3 4                                           
                                         5 4 3 2 1 2 3 4 5                                         
                                       6 5 4 3 2 1 2 3 4 5 6                                       
                                     7 6 5 4 3 2 1 2 3 4 5 6 7                                     
                                   8 7 6 5 4 3 2 1 2 3 4 5 6 7 8                                   
                                 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9                                 
                              10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10                              
                           11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11                           
                        12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12                        
                     13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13                     
                  14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14                  
               15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15               
            16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16            
         17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17         
      18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18      
   19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19   
20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Share:
23,028
user1775527
Author by

user1775527

Updated on June 27, 2020

Comments

  • user1775527
    user1775527 almost 4 years

    Write a program that prompts the user to enter an integer from 1 to 15 and displays a pyramid, as shown in the following sample run:

                1
    
              2 1 2
    
            3 2 1 2 3
    
          4 3 2 1 2 3 4 
    
        5 4 3 2 1 2 3 4 5
    
      6 5 4 3 2 1 2 3 4 5 6 
    
    7 6 5 4 3 2 1 2 3 4 5 6 7
    

    I have the following:

    num = eval(raw_input("Enter an integer from 1 to 15: "))
    
    if num < 16:
    
          for i in range(1, num + 1):
              # Print leading space
              for j in range(num -  i,  0,  -1):
                   print(" "),
              # Print numbers      
              for j in range(i, 0, -1):
                   print(j),
              for j in range(2, i + 1):
                   print(j),
               print("") 
    else: 
     print("The number you have entered is greater than 15.")
    

    This yields a misalignment for numbers greater than or equal to 10.

    I have tried print(format(j, "4d")) and all the numbers become misaligned.

    Any tips? Thanks.

  • user1775527
    user1775527 over 11 years
    any suggestions without the use of strings?
  • user1775527
    user1775527 over 11 years
    Any suggestions without the use of strings?
  • user1775527
    user1775527 over 11 years
    Any suggestions without the use of strings?
  • user1775527
    user1775527 over 11 years
    Yes. As is, is there anything small that can be added without string formatting?