Joey
Joey

Reputation: 33

Creating a triangle of characters from a users input

For an assignment I'm suppose to make a triangle using the users input if the characters are equal to an even number. The triangle is suppose to print up to 5 lines in height and the left of it should be the left half of the string and the right side of the triangle should be the right side of the string.

Example of what the triangle is suppose to look like

The problem is I can't figure out how to divide my triangle in half without hard coding it or how to properly display the white space without a loop (were not allowed to in the assignment). Right now if I were to put in "ab" it would return:

     aabb
    aabbaabb
   aabbaabbaabb
  aabbaabbaabbaabb
 aabbaabbaabbaabbaabb

Instead of:

         aabb
       aaaabbbb
     aaaaaabbbbbb
   aaaaaaaabbbbbbbb
 aaaaaaaaaabbbbbbbbbb

Here's my code:

#GET Users String
userString = input("Please enter a string with a value of 7 or less characters: ")

#CALCULATE IF userString is less than or equal to 7 and is even 
if len(userString) <= 7 and len(userString) % 2 == 0:
    print (" " * 5 + userString)
    print(" " * 4 + userString * 2)
    print(" " * 3 + userString * 3)
    print(" " * 2 + userString * 4)
    print(" " + userString * 5)

#CALCULATE IF userString is less than 7 but and off 
elif len(userString) <=7 and len(userString) % 2 == 1:
    print("You are odd")

#CALCULATE IF userString is over 7 characters
else:
    print ('The string is too long. \nGood-bye!')

Upvotes: 0

Views: 237

Answers (2)

Acepcs
Acepcs

Reputation: 274

I think you can use a stack to save each line so you can easily get a triangle-like output. Also because you can't use loop so my suggestion would be recursive.

public_stack = []

def my_func(original_str, line_count, space_num):
    if(line_count == 0):
        return
    times = line_count * 2
    half_length = len(original_str) / 2
    left_str = original_str[:half_length] * times
    right_str = original_str[half_length:] * times
    space_str = ' ' * space_num
    complete_str = space_str + left_str + right_str
    global public_stack
    public_stack.append(complete_str)
    space_num += len(original_str)
    line_count -= 1
    return my_func(original_str,line_count,space_num)

if __name__ == '__main__':
    original_str = 'ab'
    line_count = 5
    space_num = 0
    my_func(original_str,line_count,space_num)

    global public_stack
    for i in range(len(public_stack)):
        line = public_stack.pop()
        print line

Upvotes: 0

dmitryro
dmitryro

Reputation: 3506

Here's how you can do this:

def print_next(st, index):
   if index < 6:    # have not reached 5 - print offset and string
      offset = 6-index
      print '  '*offset+st
      index=index+1   # increase counter
      print_next((st[0:2]+st[-2:len(st)])*index,index) # recursively go next


print_next('aabb',1) # initial call with index set to 1

Upvotes: 2

Related Questions