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