'Number Pyramid Nested for Loop

I'm wondering if you could help me out. I'm trying to write a nested for loop in Python 3 that displays a number pyramid that looks like;

                              1
                         1    2   1
                     1   2    4   2   1
                 1   2   4    8   4   2   1
             1   2   4   8   16   8   4   2  1
          1  2   4   8  16   32  16   8   4  2  1
       1  2  4   8  16  32   64  32  16   8  4  2  1
    1  2  4  8  16  32  64  128  64  32  16  8  4  2  1

Can anybody help me out? It would be much appreciated!

This is what I have so far:

col = 1

for i in range(-1, 18, col*2):        

    for j in range(1, 0, 1):
        print("  ", end = "")

    for j in range(i, 0, -2):
        print(j, end = " ")

    print()   

So, I can only get half of the pyramid to display.

I guess the main problems I'm having is:

How do i get the output to display an increasing and then decreasing value (ie. 1, 2, 4, 2, 1)?



Solution 1:[1]

height = 8
maxHeight = height - 1
for i in range(height):
    k, Max = 1, i * 2 + 1
    print(maxHeight * "     ", end="")
    maxHeight -= 1
    for j in range(Max):
        print("%5d" % k, end="")
        if (j < (Max // 2)):
            k *= 2
        else:
            k //= 2
    print()

Output:

                                   1
                              1    2    1
                         1    2    4    2    1
                    1    2    4    8    4    2    1
               1    2    4    8   16    8    4    2    1
          1    2    4    8   16   32   16    8    4    2    1
     1    2    4    8   16   32   64   32   16    8    4    2    1
1    2    4    8   16   32   64  128   64   32   16    8    4    2    1

Solution 2:[2]

This could be the other 9 line solution.

  • Generate power of two's numbers as series
  • Find the offset need to add in each rows
  • Print the empty space for the each row before printing the palindromic list.
  • Ie. (offset * (n - i)) times " "(empty space)
  • Build palindromic series by slice operation ie. temp + temp[::-1][1:]
  • Print the palindromic series and offset spaces relative to the length of the number you are printing.

Code:

n = 8
numbers = [2**x for x in range(n)]                 # Generate interseted series.
offset = len(str(numbers[-1:])) -1                 # Find the max offset for the tree.
for i in range(1, n+1):                            # Iterate n times. 1 to n+1 helps eazy   slicing.
  temp = numbers[:i]                               # Slice series to get first row numbers.
  print(' ' * (offset * (n - i)), end=" ")         # Prefix spaces, multiples of offset.
  for num in temp + temp[::-1][1:]:                # Generate palindromic series for the row.
    print(num, end=" " * (offset - len(str(num)))) # Adjust offset for the number.
  print('')

output:

                             1   
                         1   2   1   
                     1   2   4   2   1   
                 1   2   4   8   4   2   1   
             1   2   4   8   16  8   4   2   1   
         1   2   4   8   16  32  16  8   4   2   1   
     1   2   4   8   16  32  64  32  16  8   4   2   1   
 1   2   4   8   16  32  64  128 64  32  16  8   4   2   1   

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2