MATL , 22 20 19 bytes
Ti:"2Y6Y+FT_Y)]!i_)
Ambas as entradas são baseadas em 0.
Experimente online!
Explicação
Deixe r
ec
denote as duas entradas, especificando linha e coluna com base em 0, respectivamente.
Cada nova linha no losango de Pascal pode ser construída a partir da matriz que contém as duas linhas anteriores, convolvendo com o kernel [1 1 1; 0 1 0]
e mantendo as duas últimas linhas do resultado trocadas. Isso é feito r
vezes, a partir da matriz 1
.
É mais curto usar o kernel [0 1 0; 1 1 1; 0 1 0]
, que é um literal predefinido. Isso produz uma linha extra, que será descartada.
Considere, por exemplo r = 3
, as 3
iterações.
Começando de
1
convolução com [0 1 0; 1 1 1; 0 1 0]
dá
0 1 0
1 1 1
0 1 0
Manter as duas últimas linhas (a matriz inteira, neste caso) e trocá-las fornece
0 1 0
1 1 1
Convolução do acima com [0 1 0; 1 1 1; 0 1 0]
dá
0 0 1 0 0
0 1 1 1 0
1 2 4 2 1
0 1 1 1 0
A matriz formada pelas duas últimas linhas trocadas é
0 1 1 1 0
1 2 4 2 1
Contém a nova linha na parte inferior e a anterior estendida com zeros.
A participação novamente produz
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
Tomando as duas últimas linhas trocadas,
0 1 2 4 2 1 0
1 3 8 9 8 3 1
Após as r
iterações, a saída é contida na última linha da matriz final. Por exemplo, para c = 2
(com base em 0) o resultado seria 8
. Em vez de indexar a última linha e a coluna desejada, um truque pode ser usado para explorar a simetria de cada linha: a matriz final é transposta
0 1
1 3
2 8
4 9
2 8
1 3
0 1
e seu -c
-ésimo elemento é obtido. Isso usa indexação linear, ou seja, a matriz é indexada por um único índice na ordem principal da coluna . Como a indexação é modular , a 0
-entry é o canto inferior direito (valor 1
) e a -2
-a entrada é duas etapas acima (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