MATL , 22 20 19 byte
Ti:"2Y6Y+FT_Y)]!i_)
Entrambi gli ingressi sono basati su 0.
Provalo online!
Spiegazione
Let r
andc
indicare i due input, specificando rispettivamente riga e colonna in base 0.
Ogni nuova riga nel rombo di Pascal può essere costruita dalla matrice contenente le due righe precedenti, contorcendosi con il kernel [1 1 1; 0 1 0]
e mantenendo le ultime due righe del risultato scambiate. Questo viene fatto r
volte, a partire dalla matrice 1
.
Risulta più breve usare il kernel [0 1 0; 1 1 1; 0 1 0]
, che è un valore letterale predefinito. Questo produce una riga aggiuntiva, che verrà scartata.
Considera ad esempio r = 3
, quindi ci sono 3
iterazioni.
A partire da
1
convoluzione con [0 1 0; 1 1 1; 0 1 0]
dà
0 1 0
1 1 1
0 1 0
Mantenere le ultime due righe (l'intera matrice, in questo caso) e scambiarle dà
0 1 0
1 1 1
Convoluzione di quanto sopra con [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
La matrice formata dalle ultime due righe scambiate è
0 1 1 1 0
1 2 4 2 1
Questo contiene la nuova riga in basso e la precedente estesa con zeri.
Convolgere di nuovo i rendimenti
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
Dare le ultime due righe scambiate
0 1 2 4 2 1 0
1 3 8 9 8 3 1
Dopo r
aver eseguito le iterazioni, l'output è contenuto nell'ultima riga della matrice finale. Ad esempio, per c = 2
(basato su 0) il risultato sarebbe 8
. Invece di indicizzare l'ultima riga e la colonna desiderata, può essere usato un trucco che sfrutta la simmetria di ogni riga: la matrice finale viene trasposta
0 1
1 3
2 8
4 9
2 8
1 3
0 1
e -c
viene preso il suo elemento -th. Questo utilizza l'indicizzazione lineare, ovvero la matrice è indicizzata da un singolo indice in ordine di colonna maggiore . Poiché l'indicizzazione è modulare , 0
-entry è l'angolo in basso a destra (valore 1
) e la -2
voce -th è due passaggi sopra (valore 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