Rpro
Rpro

Reputation: 99

Displaying a pyramid of number ladder

I did this below but I didn't get it right,

int i = 1;
       while(i <= 6){
             for(int j = 1;j <= 6-i;j++){
                   System.out.print("  ");
            }
            for(int m = 1; m <= i; m++){
                   System.out.print(m + " ");
            }
            i++;
            System.out.println();
     }

I got this instead :

             1
           1 2
         1 2 3
       1 2 3 4
     1 2 3 4 5 
   1 2 3 4 5 6

But I need guide on how to get this below,

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

Upvotes: 4

Views: 1156

Answers (4)

xxxvodnikxxx
xxxvodnikxxx

Reputation: 1277

There you have my solution, little smarty solution with using absolute value, with notes why is what where

public static void printPyramid(int rows) {
        // row counter
        for (int i = 1; i <= rows; i++) {

            // padding- size = rows - i
            for (int j = 1; j <= rows - i; j++) {
                // 2 spaces - char + space
                System.out.print("  ");
            }

            // print numbers
            for (int j = -i; j <= i; j++) {
                // we want only once 1, and skip print zero
                if (j == 0 || j == 1) {
                    continue;
                }

                // print absolute value
                System.out.print(Math.abs(j) + " ");
            }

            // new row- println same as print("\n");
            System.out.println();
        }
    }

With 6 rows, output is

          1 
        2 1 2 
      3 2 1 2 3 
    4 3 2 1 2 3 4 
  5 4 3 2 1 2 3 4 5 
6 5 4 3 2 1 2 3 4 5 6 

Upvotes: 1

Diasiare
Diasiare

Reputation: 755

Let's break this down into parts. First we need to figure out how to output a single level of the pyramid. Let's start without padding. For the first level it's just "1", for every other level it's the level above it surrounded by the "number" of that level (and the spaces).

private static String buildLevel(int num) {
    if (num == 1) return "1";

    return Integer.toString(num) + " " + buildLevel(num -1) + " " + Integer.toString(num);
}

We then need to be able to add the padding, so let's create a method that pads to a certain length.

private static String pad(String stringToPad, int padTo) {
    return String.join("", Collections.nCopies(padTo - stringToPad.length(), " ")) + stringToPad;
}

Putting this together we can create a method to build a pyramid by looping over the needed levels and concatenating the levels together.

private static String buildPyramid(int height) {
    int expectedLength = height * 2 + 1;

    String out = "";

    for (int i = 1; i <= height; i++) {
        out += pad(buildLevel(i), expectedLength) + "\n";
        expectedLength += 2;
    }

    return out;
}

The length of the first line is the height * 2 + 1, derived by counting. (This includes two spaces at the beginning of each line, which is in your examples). Each subsequent line should be 2 longer than the one above it.

Call it like this to produce your example

public static void main(String[] args) {
    System.out.println(buildPyramid(5));
}

Outputs:

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

For completeness, here is all the code in one block.

private static String buildLevel(int num) {
    if (num == 1) return "1";

    return Integer.toString(num) + " " + buildLevel(num -1) + " " + Integer.toString(num);
}

private static String pad(String stringToPad, int padTo) {
    return String.join("", Collections.nCopies(padTo - stringToPad.length(), " ")) + stringToPad;
}

private static String buildPyramid(int height) {
    int expectedLength = height * 2 + 1;

    String out = "";

    for (int i = 1; i <= height; i++) {
        out += pad(buildLevel(i), expectedLength) + "\n";
        expectedLength += 2;
    }

    return out;
}

public static void main(String[] args) {
    System.out.println(buildPyramid(6));
}

Upvotes: 0

Justin Albano
Justin Albano

Reputation: 3939

This should do the trick, but it's important to understand what is going on:

public class Main {

    public static void main(String[] args) {

        for (int i = 0; i <= 6; i++) {
            printRow(6, i);
        }
    }

    public static void printRow(int highestValue, int rowValue) {

        for (int i = 0; i < (highestValue - rowValue); i++) {
            System.out.print("  ");
        }

        for (int i = rowValue; i >= 1; i--) {
            System.out.print(i + " ");
        }

        for (int i = 2; i <= rowValue; i++) {
            System.out.print(i + " ");
        }

        System.out.println();
    }
}

The first loop pads the left side of the pyramid, as you have already done. The second loop counts down from the value of the row to 1, which is the center of the pyramid. The third loop counts back up from 2 to the value of the row. Note that for the first row, 2 will not be printed, because i = 2 is greater than rowValue, which is 1, so the loop is skipped.

Running this results in the following:

          1 
        2 1 2 
      3 2 1 2 3 
    4 3 2 1 2 3 4 
  5 4 3 2 1 2 3 4 5 
6 5 4 3 2 1 2 3 4 5 6 

Note that a row starting with 6 is printed since I used the bounds you provided. If this is not what should be done (from your example output), I will leave that up to you on how to fix this. Pay attention to the name of the arguments in the printRow method to see why there is an extra row printed.

Upvotes: 3

Marvin Fischer
Marvin Fischer

Reputation: 2572

while(i <= 6){
    for(int j = 1; j <= 6 - i; j++){
        System.out.print("  ");
    }
    for(int m = i-1; m > 1; m--){
        System.out.print(m + " ");
    }
    for(int m = 1; m < i; m++){
        System.out.print(m + " ");
    }

    i++;
    System.out.println();
}

This should work for you, i just added / edited this part:

    for(int m = i-1; m > 1; m--){
        System.out.print(m + " ");
    }
    for(int m = 1; m < i; m++){
        System.out.print(m + " ");
    }

To let it count down again, and let it count up afterwards

Upvotes: 5

Related Questions