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 ret cdé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 rfois, à 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 3ité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 rité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' 0entrée est le coin inférieur droit (valeur 1) et l' -2entré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