MATL , 22 20 19 байтов
Ti:"2Y6Y+FT_Y)]!i_)
Оба входа основаны на 0.
Попробуйте онлайн!
объяснение
Позвольте r
и c
обозначить два входа, указав 0 и строки и столбца соответственно.
Каждая новая строка в ромбе Паскаля может быть построена из матрицы, содержащей предыдущие две строки, путем свертки с ядром [1 1 1; 0 1 0]
и сохранения двух последних строк результата. Это делается r
раз, начиная с матрицы 1
.
Оказывается, короче использовать ядро [0 1 0; 1 1 1; 0 1 0]
, которое является предопределенным литералом. Это создает дополнительную строку, которая будет отброшена.
Рассмотрим, к примеру r = 3
, чтобы были 3
итерации.
Начиная с
1
свертка [0 1 0; 1 1 1; 0 1 0]
дает
0 1 0
1 1 1
0 1 0
Сохранение двух последних строк (в данном случае всей матрицы) и их замена дает
0 1 0
1 1 1
Свертывание выше [0 1 0; 1 1 1; 0 1 0]
дает
0 0 1 0 0
0 1 1 1 0
1 2 4 2 1
0 1 1 1 0
Матрица, образованная из двух последних замененных строк:
0 1 1 1 0
1 2 4 2 1
Это содержит новую строку внизу, а предыдущий расширен нулями.
Свертка снова дает
0 0 1 1 1 0 0
0 1 2 3 2 1 0
1 3 8 9 8 3 1
0 1 2 4 2 1 0
Взяв последние два ряда поменялись местами дает
0 1 2 4 2 1 0
1 3 8 9 8 3 1
После того как r
итерации выполнены, выходные данные содержатся в последней строке окончательной матрицы. Например, для c = 2
(на основе 0) результат будет 8
. Вместо индексации последней строки и нужного столбца можно использовать трюк, который использует симметрию каждой строки: конечная матрица транспонируется
0 1
1 3
2 8
4 9
2 8
1 3
0 1
и его -c
-й элемент взят. При этом используется линейное индексирование, то есть матрица индексируется одним индексом в порядке старших столбцов . Поскольку индексирование является модульным , 0
-entry - это правый нижний угол (значение 1
), а -2
-я запись - на два шага выше (значение 8
).
T % Push true
i % Input row number
:" % Do the following that many times
2Y6 % Push predefined literal [0 1 0; 1 1 1; 0 1 0]
Y+ % 2D convolution, increasing size
FT_ % Push [0 -1]
Y) % Matrix with rows 0 (last) and -1 (second-last), in that order
] % End
! % Transpose
i % Input: colun number
_ % Negate
) % Entry with that index. Implicitly display