MATL , 22 20 19 octets
Ti:"2Y6Y+FT_Y)]!i_)
Les deux entrées sont basées sur 0.
Essayez-le en ligne!
Explication
Soit r
et c
dénotons les deux entrées, en spécifiant respectivement une ligne et une colonne basées sur 0.
Chaque nouvelle ligne du losange de Pascal peut être construite à partir de la matrice contenant les deux lignes précédentes en convoluant avec le noyau [1 1 1; 0 1 0]
et en gardant les deux dernières lignes du résultat échangées. Cela se fait plusieurs r
fois, à partir de la matrice 1
.
Il s'avère plus court d'utiliser le noyau [0 1 0; 1 1 1; 0 1 0]
, qui est un littéral prédéfini. Cela produit une ligne supplémentaire, qui sera supprimée.
Considérez par exemple r = 3
, donc il y a des 3
itérations.
A partir de
1
convolution avec [0 1 0; 1 1 1; 0 1 0]
donne
0 1 0
1 1 1
0 1 0
Garder les deux dernières lignes (la matrice entière, dans ce cas) et les échanger donne
0 1 0
1 1 1
Convolution de ce qui précède avec [0 1 0; 1 1 1; 0 1 0]
donne
0 0 1 0 0
0 1 1 1 0
1 2 4 2 1
0 1 1 1 0
La matrice formée par les deux dernières lignes permutées est
0 1 1 1 0
1 2 4 2 1
Celui-ci contient la nouvelle ligne en bas et la précédente étendue avec des zéros.
Convoluer à nouveau donne
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
Prendre les deux dernières lignes permutées donne
0 1 2 4 2 1 0
1 3 8 9 8 3 1
Une fois les r
itérations effectuées, la sortie est contenue dans la dernière ligne de la matrice finale. Par exemple, pour c = 2
(basé sur 0), le résultat serait 8
. Au lieu d'indexer la dernière ligne et la colonne souhaitée, une astuce peut être utilisée qui exploite la symétrie de chaque ligne: la matrice finale est transposée
0 1
1 3
2 8
4 9
2 8
1 3
0 1
et son -c
-ème élément est pris. Cela utilise une indexation linéaire, c'est-à-dire que la matrice est indexée par un index unique dans l'ordre des colonnes . Étant donné que l'indexation est modulaire , l' 0
entrée est le coin inférieur droit (valeur 1
) et l' -2
entrée -th est deux étapes au-dessus (valeur 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