MATL , 22 20 19 bytes
Ti:"2Y6Y+FT_Y)]!i_)
Ambas entradas están basadas en 0.
Pruébalo en línea!
Explicación
Deje r
y c
denote las dos entradas, especificando fila y columna basadas en 0 respectivamente.
Cada nueva fila en el rombo de Pascal se puede construir a partir de la matriz que contiene las dos filas anteriores convolucionando con el núcleo [1 1 1; 0 1 0]
y manteniendo intercambiadas las últimas dos filas del resultado. Esto se hace r
veces, comenzando desde la matriz 1
.
Resulta que es más corto usar el núcleo [0 1 0; 1 1 1; 0 1 0]
, que es un literal predefinido. Esto produce una fila adicional, que se descartará.
Considere, por ejemplo r = 3
, que hay 3
iteraciones.
Empezando desde
1
convolución con [0 1 0; 1 1 1; 0 1 0]
da
0 1 0
1 1 1
0 1 0
Mantener las dos últimas filas (la matriz completa, en este caso) e intercambiarlas da
0 1 0
1 1 1
Convolución de lo anterior con [0 1 0; 1 1 1; 0 1 0]
da
0 0 1 0 0
0 1 1 1 0
1 2 4 2 1
0 1 1 1 0
La matriz formada por las dos últimas filas intercambiadas es
0 1 1 1 0
1 2 4 2 1
Contiene la nueva fila en la parte inferior y la anterior extendida con ceros.
Convolucionar nuevamente produce
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
Tomar las dos últimas filas intercambiadas da
0 1 2 4 2 1 0
1 3 8 9 8 3 1
Una vez que r
se han realizado las iteraciones, la salida está contenida en la última fila de la matriz final. Por ejemplo, para c = 2
(basado en 0) el resultado sería 8
. En lugar de indexar la última fila y la columna deseada, se puede utilizar un truco que explota la simetría de cada fila: la matriz final se transpone
0 1
1 3
2 8
4 9
2 8
1 3
0 1
y -c
se toma su enésimo elemento. Esto utiliza la indexación lineal, es decir, la matriz se indexa mediante un único índice en el orden de columnas principales . Como la indexación es modular , la 0
entrada-es la esquina inferior derecha (valor 1
) y la -2
entrada -th está dos pasos arriba (valor 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