user2210599
user2210599

Reputation: 83

Draw inverted triangle of asterisk by using nested loops in Python

I've to write a program that get a series of valid inputs from user and then uses the nested loops to draw the inverted triangle.

I've managed to work out the triangle but I struggling on inverted triangle. Can anyone give me some hint on how to draw the inverted triangle by only print a single charater of * and without using * * rowlength?

Global constant

L = 10

Get rows number

rows = int(input ( 'Enter a number of rows: ' ) )

Rows cannot less than 10 or greater than 100

while rows < 10 or rows > 100:
    if rows < L:
        print( 'The number is too Low.' )
    else:
        print( 'The number is too high.' )
    rows = int(input ( 'Enter the correct value: ' ) )

Display the triangle

for r in range(rows):
    for c in range(r + 1):
        print('*', end='')
print()

Upvotes: 1

Views: 5282

Answers (1)

Nick Burns
Nick Burns

Reputation: 983

This is very similar to a question I had to do for class once, but we were implementing it in C. Actually, quite cool to go back now, reimplement it in python and look at the difference.

The problem we had in class was very similar. My python code to make this work is:

while True:
    rows = input('Enter the number of rows:  ')

    if 3 <= rows <= 33:
        break
    else:
        continue

padding = ' '*rows        
while rows > 0:
    print(padding[rows:] + '*'*rows)
    rows = rows - 1

-- modified below, to print outline of inverted triangle:

# print the outline of an inverted triangle:
height = rows

# inner padding for min height (3)
inner_buffer = [0, 1, 3]
while len(inner_buffer) <= rows:
    inner_buffer.append(inner_buffer[-1]+2)

while height > 0:
    outer_padding = ' '*(rows - height)    
    if height == 1:
        print(outer_padding + '*')
    else:
        inner_padding = ' '*(inner_buffer.pop()-2)
        print(outer_padding + '*' + inner_padding + '*')
    height = height - 1

There has got to be a more elegant want to code this, but simply a working hack to see if we are on the right track.

New revision below: -- function that will produce a regular triangle, or inverted triangle as defined

def get_rows():
    while True:
        rows = input('Enter the number of rows:  ')
        if 3 <= rows <= 33:
            return rows

def triangle(rows, regular=False, invert=True):

    if invert:
        height = -1 * rows
    else:
        height = 0

    # inner padding for min height (3)
    inner_buffer = [0, 1, 3]
    while len(inner_buffer) <= rows:
        inner_buffer.append(inner_buffer[-1]+2)

    level = 0        
    while level <= rows:
        outer_padding = ' '*(rows - abs(height))

        if height == 0:
            print(outer_padding + '*')
        else:
            inner_padding = ' '*( inner_buffer[ abs(height) ] )
            print(outer_padding + '*' + inner_padding + '*')

        height += 1
        level += 1

Let me know :)

Upvotes: 1

Related Questions