Saturday, November 16, 2024
Google search engine
HomeData Modelling & AIPrint symmetric double triangle pattern

Print symmetric double triangle pattern

Given a value n, we need to print the following pattern accordingly, using only constant extra space.
Examples: 
 

Input : n = 1
Output : x

Input : n = 2
Output :  
 x 
x x 
 x 

Input: n = 5
Output:
    x                                   
     x 
    o x 
     o x 
x o x o x 
 x o 
  x o 
   x 
    x 

Input: n = 6
Output:
     x 
      x 
     o x 
      o x 
     x o x 
x o x x o x 
 x o x 
  x o 
   x o 
    x 
     x

Input : n = 7;
Output :
      x 
       x 
      o x 
       o x 
      x o x 
       x o x 
x o x o x o x 
 x o x 
  x o x 
   x o 
    x o 
     x 
      x 

Input : n = 8;
Output : 
       x 
        x 
       o x 
        o x 
       x o x 
        x o x 
       o x o x 
x o x o o x o x 
 x o x o 
  x o x 
   x o x 
    x o 
     x o 
      x 
       x 

 

We can divide this problem into 3 parts: 
1) Print upper half with n-1 lines for odd n or n-2 lines for even n. 
2) Print middle lines, 1 line for odd n or 3 lines for even n. 
3) Print lower half, with n-1 lines for odd n or n-2 lines for even n. 
For such complex patterns it may be easier if we can use 1-based indexing 
and separate functions to print characters beginning with x or o. 
 

C++




// Author:: Satish Srinivas
#include <iostream>
 
using namespace std;
 
// print alternate x o beginning with x
void printx(int n)
{
    for (int i = 1; i <= n; i++) {
        if (i % 2 != 0)
            cout << "x ";
        else
            cout << "o ";
    }
    return;
}
 
// print alternate x o beginning with o
void printo(int n)
{
    for (int i = 1; i <= n; i++) {
        if (i % 2 != 0)
            cout << "o ";
        else
            cout << "x ";
    }
    return;
}
 
// print the pattern for n
void printPattern(int n)
{
    // upper half
    // n-1 lines for odd, n-2 lines for even
    int x = n;
 
    if (n % 2 == 0)
        x = x - 1;
 
    // number of spaces to leave in each line
    int p = n - 1;
 
    // number of characters in each line
    int s = 1;
 
    // prints double lines in each iteration
    for (int i = 1; i <= (x - 1) / 2; i++) {
        for (int j = 1; j <= p; j++) {
            cout << " ";
        }
 
        if (i % 2 != 0)
            printx(s);
        else
            printo(s);
 
        cout << endl;
        p++;
 
        for (int j = 1; j <= p; j++)
            cout << " ";       
 
        if (i % 2 != 0)
            printx(s);
        else
            printo(s);
 
        cout << endl;
 
        p--;
        s++;
    }
 
    // extra upper middle for even
    if (n % 2 == 0) {
        for (int i = 1; i <= p; i++)
            cout << " ";
 
        if (n % 4 != 0)
            printx(n / 2);
        else
            printo(n / 2);
 
        cout << endl;
    }
 
    // middle line
    if (n % 2 != 0)
        printx(n);
     
    else {
        if (n % 4 != 0) {
            printx(n / 2);
            printx(n / 2);
        }
        else {
            printx(n / 2);
            printo(n / 2);
        }
    }
 
    cout << endl;
 
    // extra lower middle for even
    if (n % 2 == 0) {
        cout << " ";
        printx(n / 2);
        cout << endl;
    }
 
    // lower half
    p = 1;
 
    if (n % 2 == 0) {
        x--;
        p = 2;
    }
 
    int q = x / 2;
 
    // one line for each iteration
    for (int i = 1; i <= x; i++) {
        for (int j = 1; j <= p; j++)
            cout << " ";
 
        printx(q);
 
        if (i % 2 == 0)
            q--;
 
        cout << endl;
 
        p++;
    }
 
    cout << endl;
}
 
// Driver code
int main()
{
    int n = 7;
    printPattern(n);
    n = 8;
    printPattern(n);
    return 0;
}


Java




// java program to Print symmetric
// double triangle pattern
class GFG
{
         
    // print alternate x o beginning with x
    static void printx(int n)
    {
        for (int i = 1; i <= n; i++) {
            if (i % 2 != 0)
                System.out.print("x ");
            else
                System.out.print("o ");
        }
        return;
    }
     
    // print alternate x o beginning with o
    static void printo(int n)
    {
        for (int i = 1; i <= n; i++) {
            if (i % 2 != 0)
                System.out.print("o ");
            else
                System.out.print("x ");
        }
        return;
    }
     
    // print the pattern for n
    static void printPattern(int n)
    {
        // upper half n-1 lines for
        // odd, n-2 lines for even
        int x = n;
     
        if (n % 2 == 0)
            x = x - 1;
     
        // number of spaces to leave in each line
        int p = n - 1;
     
        // number of characters in each line
        int s = 1;
     
        // prints double lines in each iteration
        for (int i = 1; i <= (x - 1) / 2; i++) {
            for (int j = 1; j <= p; j++) {
                System.out.print(" ");
            }
     
            if (i % 2 != 0)
                printx(s);
            else
                printo(s);
     
            System.out.println();
            p++;
     
            for (int j = 1; j <= p; j++)
                System.out.print(" ");    
     
            if (i % 2 != 0)
                printx(s);
            else
                printo(s);
     
            System.out.println();
     
            p--;
            s++;
        }
     
        // extra upper middle for even
        if (n % 2 == 0) {
            for (int i = 1; i <= p; i++)
                System.out.print(" ");
     
            if (n % 4 != 0)
                printx(n / 2);
            else
                printo(n / 2);
     
            System.out.println();
        }
     
        // middle line
        if (n % 2 != 0)
            printx(n);
         
        else {
            if (n % 4 != 0) {
                printx(n / 2);
                printx(n / 2);
            }
            else {
                printx(n / 2);
                printo(n / 2);
            }
        }
     
        System.out.println();
     
        // extra lower middle for even
        if (n % 2 == 0) {
            System.out.print(" ");
            printx(n / 2);
            System.out.println();
        }
     
        // lower half
        p = 1;
     
        if (n % 2 == 0) {
            x--;
            p = 2;
        }
     
        int q = x / 2;
     
        // one line for each iteration
        for (int i = 1; i <= x; i++) {
            for (int j = 1; j <= p; j++)
                System.out.print(" ");
     
            printx(q);
     
            if (i % 2 == 0)
                q--;
     
            System.out.println();
     
            p++;
        }
     
        System.out.println();
    }
     
    // Driver code
    public static void main (String[] args)
    {
        int n = 7;
        printPattern(n);
         
        n = 8;
        printPattern(n);
    }
}
 
 
// This code is contributed by Anant Agarwal.


Python3




# Python3 program to Print symmetric
# double triangle pattern
 
# Print alternate x o beginning with x
def printx(n):
 
    for i in range(1, n + 1):
        if (i % 2 != 0):
            print("x ", end = "")
        else:
            print("o ", end = "")
 
    return
 
# Print alternate x o beginning with o
def printo(n):
 
    for i in range(1, n + 1):
        if (i % 2 != 0):
            print("o ", end = "")
        else:
            print("x ", end = "")
 
    return
 
# Print the pattern for n
def printPattern(n):
 
    # upper half
    # n-1 lines for odd,
    # n-2 lines for even
    x = n
 
    if (n % 2 == 0):
        x = x - 1
 
    # number of spaces to leave
    # in each line
    p = n - 1
 
    # number of characters in each line
    s = 1
 
    # prints double lines in each iteration
    for i in range(1, (x - 1) // 2 + 1):
        for j in range(1, p + 1):
            print(" ", end = "")
 
        if (i % 2 != 0):
            printx(s)
        else:
            printo(s)
 
        print()
        p += 1
 
        for j in range(1, p + 1):
            print(" ", end = "")
 
        if (i % 2 != 0):
            printx(s)
        else:
            printo(s)
 
        print()
 
        p -= 1
        s += 1
 
    # extra upper middle for even
    if (n % 2 == 0):
        for i in range(1, p + 1):
            print(" ", end = "")
 
        if (n % 4 != 0):
            printx(n // 2)
        else:
            printo(n // 2)
 
        print()
 
    # middle line
    if (n % 2 != 0):
        printx(n)
    else:
        if (n % 4 != 0):
            printx(n // 2)
            printx(n // 2)
        else:
            printx(n // 2)
            printo(n // 2)
 
    print()
 
    # extra lower middle for even
    if (n % 2 == 0):
        print(" ", end = "")
        printx(n // 2)
        print()
 
    # lower half
    p = 1
 
    if (n % 2 == 0):
        x-=1
        p = 2
 
    q = x // 2
 
    # one line for each iteration
    for i in range(1, x + 1):
        for j in range(1, p + 1):
            print(" ", end = "")
 
        printx(q)
 
        if (i % 2 == 0):
            q -= 1
 
        print()
 
        p += 1
 
    print()
 
# Driver code
n = 7
printPattern(n)
n = 8
printPattern(n)
 
# This code is contributed by mohit kumar


Javascript




<script>
      // JavaScript program to Print symmetric
      // double triangle pattern
      // print alternate x o beginning with x
      function printx(n) {
        for (var i = 1; i <= n; i++) {
          if (i % 2 !== 0) document.write("x  ");
          else document.write("o  ");
        }
        return;
      }
 
      // print alternate x o beginning with o
      function printo(n) {
        for (var i = 1; i <= n; i++) {
          if (i % 2 !== 0) document.write("o  ");
          else document.write("x  ");
        }
        return;
      }
 
      // print the pattern for n
      function printPattern(n) {
        // upper half n-1 lines for
        // odd, n-2 lines for even
        var x = n;
 
        if (n % 2 === 0) x = x - 1;
 
        // number of spaces to leave in each line
        var p = n - 1;
 
        // number of characters in each line
        var s = 1;
 
        // prints double lines in each iteration
        for (var i = 1; i <= (x - 1) / 2; i++) {
          for (var j = 1; j <= p; j++) {
            document.write("  ");
          }
 
          if (i % 2 !== 0) printx(s);
          else printo(s);
 
          document.write("<br>");
          p++;
 
          for (var j = 1; j <= p; j++) document.write("  ");
 
          if (i % 2 != 0) printx(s);
          else printo(s);
 
          document.write("<br>");
 
          p--;
          s++;
        }
 
        // extra upper middle for even
        if (n % 2 === 0) {
          for (var i = 1; i <= p; i++) document.write("  ");
 
          if (n % 4 !== 0) printx(n / 2);
          else printo(n / 2);
 
          document.write("<br>");
        }
 
        // middle line
        if (n % 2 !== 0) printx(n);
        else {
          if (n % 4 !== 0) {
            printx(n / 2);
            printx(n / 2);
          } else {
            printx(n / 2);
            printo(n / 2);
          }
        }
 
        document.write("<br>");
 
        // extra lower middle for even
        if (n % 2 === 0) {
          document.write("  ");
          printx(n / 2);
          document.write("<br>");
        }
 
        // lower half
        p = 1;
 
        if (n % 2 === 0) {
          x--;
          p = 2;
        }
 
        var q = x / 2;
 
        // one line for each iteration
        for (var i = 1; i <= x; i++) {
          for (var j = 1; j <= p; j++) document.write("  ");
 
          printx(q);
 
          if (i % 2 === 0) q--;
 
          document.write("<br>");
 
          p++;
        }
 
        document.write("<br>");
      }
 
      // Driver code
      var n = 7;
      printPattern(n);
 
      n = 8;
      printPattern(n);
    </script>


C#




// c# equivalent of above java code
using System;
  
class GFG
{
    // print alternate x o beginning with x
    static void PrintX(int n)
    {
        for (int i = 1; i <= n; i++)
        {
            if (i % 2 != 0)
                Console.Write("x ");
            else
                Console.Write("o ");
        }
        return;
    }
     
    // print alternate x o beginning with o
    static void PrintO(int n)
    {
        for (int i = 1; i <= n; i++)
        {
            if (i % 2 != 0)
                Console.Write("o ");
            else
                Console.Write("x ");
        }
        return;
    }
     
    // print the pattern for n
    static void PrintPattern(int n)
    {
        // upper half n-1 lines for
        // odd, n-2 lines for even
        int x = n;
     
        if (n % 2 == 0)
            x = x - 1;
     
        // number of spaces to leave in each line
        int p = n - 1;
     
        // number of characters in each line
        int s = 1;
     
        // prints double lines in each iteration
        for (int i = 1; i <= (x - 1) / 2; i++)
        {
            for (int j = 1; j <= p; j++)
            {
                Console.Write(" ");
            }
     
            if (i % 2 != 0)
                PrintX(s);
            else
                PrintO(s);
     
            Console.WriteLine();
            p++;
     
            for (int j = 1; j <= p; j++)
                Console.Write(" ");    
     
            if (i % 2 != 0)
                PrintX(s);
            else
                PrintO(s);
     
            Console.WriteLine();
     
            p--;
            s++;
        }
     
        // extra upper middle for even
        if (n % 2 == 0)
        {
            for (int i = 1; i <= p; i++)
                Console.Write(" ");
     
            if (n % 4 != 0)
                PrintX(n / 2);
            else
                PrintO(n / 2);
     
            Console.WriteLine();
        }
     
        // middle line
        if (n % 2 != 0)
            PrintX(n);
         
        else
        {
            if (n % 4 != 0)
            {
                PrintX(n / 2);
                PrintX(n / 2);
            }
            else
            {
                PrintX(n / 2);
                PrintO(n / 2);
            }
        }
     
        Console.WriteLine();
     
        // extra lower middle for even
        if (n % 2 == 0)
        {
            Console.Write(" ");
            PrintX(n / 2);
            Console.WriteLine();
        }
     
        // lower half
        p = 1;
     
        if (n % 2 == 0)
        {
            x--;
            p = 2;
        }
     
        int q = x / 2;
     
        // one line for each iteration
        for (int i = 1; i <= x; i++)
        {
            for (int j = 1; j <= p; j++)
                Console.Write(" ");
     
            PrintX(q);
     
            if (i % 2 == 0)
                q--;
     
            Console.WriteLine();
     
            p++;
        }
     
        Console.WriteLine();
    }
     
    // Driver code
    public static void Main (String[] args)
    {
        int n = 7;
        PrintPattern(n);
         
        n = 8;
        PrintPattern(n);
    }
}


Output: 
 

      x 
       x 
      o x 
       o x 
      x o x 
       x o x 
x o x o x o x 
 x o x 
  x o x 
   x o 
    x o 
     x 
      x 

       x 
        x 
       o x 
        o x 
       x o x 
        x o x 
       o x o x 
x o x o o x o x 
 x o x o 
  x o x 
   x o x 
    x o 
     x o 
      x 
       x 

Time Complexity: O(N^2)

Auxiliary Space: O(1) because it is using constant space for variables

This article is contributed by Satish Srinivas. If you like neveropen and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the neveropen main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
 

Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

Dominic Rubhabha-Wardslaus
Dominic Rubhabha-Wardslaushttp://wardslaus.com
infosec,malicious & dos attacks generator, boot rom exploit philanthropist , wild hacker , game developer,
RELATED ARTICLES

Most Popular

Recent Comments