Q:

Нужна помощь в табуляции треугольника Паскаля

Всем привет!
Я только недавно начал учить Java и решил сделать для себя небольшой квест, который поможет мне освоить особенности этого языка. Я переделываю свои лабораторные с C++. Случилась у меня одна загвоздка: я не могу красиво построить треугольник Паскаля. Идея состоит в том, чтобы в цикле при заполнении треугольника писать стринговую переменную из пробелов и в каждой новой строке выводить ее значение, но на один пробел меньше. Код прилагаю.
Большое вам спасибо :)
public class Paskal {
    public static final int LINES = 10; 

    public static void main(String[] args) {
        String MySpace = "                     ";
        int[][] p = new int [LINES][];
        p[0] = new int[1];
         System.out.print(MySpace);
         System. out. println (p[0][0] = 1);

        p[1] = new int[2];

        p[1][0] = p[1][1] = 1;
        System.out.print(MySpace + "" );
        System.out.println(p[1][0] + " " + p[1][1]);

        for (int i = 2; i < LINES; i++){
            p[i] = new int[i+1];
            System.out.print(MySpace);
            System.out.print((p[i][0] = 1) + " ");

            for (int j = 1; j < i; j++)
                System.out.print((p[i][j] = p[i-1][j-1] + p[i-1][j]) + " ");

            System.out.println(p[i][i] = 1);
        }
    }
}

A:

Можно воспользоваться форматированным выводом (System.out.printf, String.format, java.util.Formatter и компания), тогда каждое число будет занимать фиксированное количество символов, и отступ можно будет просто посчитать. Если еще вынести вывод всей строки в отдельный метод (и заодно отделить вычисления от вывода), то даже не очень страшно выглядит:
static final int LINES = 10;

// шаблон для форматирования числа: число занимает до пяти символов, недостающие
// дополняются проблелами слева, затем один пробел
// Полный синтаксис:
// https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html#syntax
// аналогично printf в С
static final String NUMBER_FORMAT = "%5d ";
// Длина одного форматированного числа (5 знаков под число и пробел)
static final int NUMBER_STRING_LENGTH = 6;

// максимальное количество чисел в строке совпадает с количеством строк
//  длина этой строки в символах = число строк * длина одного числа
static final int MAX_LINE_LENGTH = LINES * NUMBER_STRING_LENGTH;

// запас пробелов
static final String SPACES = "                                                               ";
static void printArray( int[] array ) {
    // мы знаем количество чисел в строке (array.length),
    //   длину каждого числа в символах и длину самой длинной строки
    //   чтобы отцентрировать нашу строку, нужно отступить на половину
    //   разницы между нашей строкой и самой длинной
    //   SPACES.substring создает строку с нужным количеством пробелов
    System.out.print( SPACES.substring( 0, (MAX_LINE_LENGTH - NUMBER_STRING_LENGTH * array.length)/2 ) );

    for ( int i = 0; i < array.length; i++ ) 
        System.out.printf( NUMBER_FORMAT, array[i] );

    System.out.println(); 
}

public static void main(String[] args) {
    int[][] p = new int[LINES][];
    p[0] = new int[] {1};
    printArray( p[0] );

    for (int i = 1; i < LINES; i++) {
        p[i] = new int[i + 1];

        p[i][0] = 1;

        for (int j = 1; j < i; j++)
            p[i][j] = p[i - 1][j - 1] + p[i - 1][j];

        p[i][i] = 1;

        printArray( p[i] );
    }
}

Вывод:
                           1 
                        1     1 
                     1     2     1 
                  1     3     3     1 
               1     4     6     4     1 
            1     5    10    10     5     1 
         1     6    15    20    15     6     1 
      1     7    21    35    35    21     7     1 
   1     8    28    56    70    56    28     8     1 
1     9    36    84   126   126    84    36     9     1 

