Python Program to print a number diamond of any given size N in Rangoli Style

Given an integer N, the task is to print a number diamond of size N in rangoli style where N means till Nth number from number ‘1’.

Examples:

Input : 
2
Output :
--2--
2-1-2
--2--

Input : 
3
Output :
----3----
--3-2-3--
3-2-1-2-3
--3-2-3--
----3----

Input :
4
Output :
------4------
----4-3-4----
--4-3-2-3-4--
4-3-2-1-2-3-4
--4-3-2-3-4--
----4-3-4----
------4------

Approach:
First of all print from the first row till middle row, and then print from the row after middle row till the last row. The total number of positions in each row will be 4(N-1) + 1. Number of rows will be 2(N-1) + 1. Time complexity is O(N^2).

Below is the implementation.

filter_none

edit
close

play_arrow

link
brightness_4
code

def print_diamond(size):
      
    # print the first triangle
    # (the upper half)
    for i in range (size):
          
        # print from first row till
        # middle row
        rownum = i + 1
        num_alphabet = 2 * rownum - 1
        space_in_between_alphabets = num_alphabet - 1
          
        total_spots = (2 * size - 1) * 2 - 1
        total_space = total_spots - num_alphabet
          
        space_leading_trailing = total_space - space_in_between_alphabets
        lead_space = int(space_leading_trailing / 2)
        trail_space = int(space_leading_trailing / 2)
          
        # print the leading spaces
        for j in range(lead_space):
            print('-', end ='')
          
        # determine the middle character
        mid_char = (1 + size - 1) - int(num_alphabet / 2)
          
        # start with the last character 
        k = 1 + size - 1
        is_alphabet_printed = False
        mid_char_reached = False
          
        # print the numbers alternated by '-'
        for j in range(num_alphabet + space_in_between_alphabets):
              
            if not is_alphabet_printed:
                print(str(k), end ='')
                is_alphabet_printed = True
                  
                if k == mid_char:
                    mid_char_reached = True
                  
                if mid_char_reached == True:
                    k += 1
                  
                else:
                    k -= 1
              
            else:
                print('-', end ='')
                is_alphabet_printed = False
          
        # print the trailing spaces
        for j in range(trail_space):
            print('-', end ='')
          
        # go to the next line
        print('')
      
    # print the rows after middle row 
    # till last row (the second triangle 
    # which is inverted, i.e., the lower half)
    for i in range(size + 1, 2 * size):
          
        rownum = i
        num_alphabet = 2 * (2 * size - rownum) - 1
        space_in_between_alphabets = num_alphabet - 1
          
        total_spots = (2 * size - 1) * 2 - 1
        total_space = total_spots - num_alphabet
          
        space_leading_trailing = total_space - space_in_between_alphabets
        lead_space = int(space_leading_trailing / 2)
        trail_space = int(space_leading_trailing / 2)
          
        # print the leading spaces
        for j in range(lead_space):
            print('-', end ='')
          
        mid_char = (1 + size - 1) - int(num_alphabet / 2)
          
        # start with the last char
        k = 1 + size - 1
        is_alphabet_printed = False
        mid_char_reached = False
          
        # print the numbers alternated by '-'
        for j in range(num_alphabet + space_in_between_alphabets):
              
            if not is_alphabet_printed:
                print(str(k), end ='')
                is_alphabet_printed = True
                  
                if k == mid_char:
                    mid_char_reached = True
                  
                if mid_char_reached == True:
                    k += 1
                  
                else:
                    k -= 1
              
            else:
                print('-', end ='')
                is_alphabet_printed = False
          
        # print the trailing spaces
        for j in range(trail_space):
            print('-', end ='')
          
        # go to the next line
        print('')
  
# Driver Code
if __name__ == '__main__':
      
    n = 5
    print_diamond(n)

chevron_right


Output:

--------5--------
------5-4-5------
----5-4-3-4-5----
--5-4-3-2-3-4-5--
5-4-3-2-1-2-3-4-5
--5-4-3-2-3-4-5--
----5-4-3-4-5----
------5-4-5------
--------5--------

Attention geek! Strengthen your foundations with the Python Programming Foundation Course and learn the basics.

To begin with, your interview preparations Enhance your Data Structures concepts with the Python DS Course.




My Personal Notes arrow_drop_up

NET Core, Azure, AWS, python and AI/ML expert having 14 years of experience currently working in the role of Digital Transformation Architect in various fields like cloud technologies, machine learning, IOT and DevOps

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.