MATL , 22 20 19 Bytes
Ti:"2Y6Y+FT_Y)]!i_)
Beide Eingänge sind 0-basiert.
Probieren Sie es online!
Erläuterung
Lassen Sie r
und c
bezeichnen Sie die zwei Eingaben, die 0-basierte Zeile bzw. Spalte angeben.
Jede neue Zeile in Pascals Rhombus kann aus der Matrix erstellt werden, die die vorherigen beiden Zeilen enthält, indem Sie mit dem Kernel zusammenarbeiten [1 1 1; 0 1 0]
und die letzten beiden Zeilen des Ergebnisses vertauschen. Dies geschieht r
mal ausgehend von der Matrix 1
.
Es stellt sich als kürzer heraus, den Kernel zu verwenden [0 1 0; 1 1 1; 0 1 0]
, der ein vordefiniertes Literal ist. Dies erzeugt eine zusätzliche Zeile, die verworfen wird.
Betrachten Sie zum Beispiel r = 3
, so gibt es 3
Iterationen.
Ab
1
Faltung mit [0 1 0; 1 1 1; 0 1 0]
gibt
0 1 0
1 1 1
0 1 0
Halten Sie die letzten beiden Zeilen (in diesem Fall die gesamte Matrix) und tauschen Sie sie aus
0 1 0
1 1 1
Faltung der obigen mit [0 1 0; 1 1 1; 0 1 0]
gibt
0 0 1 0 0
0 1 1 1 0
1 2 4 2 1
0 1 1 1 0
Die Matrix aus den beiden zuletzt getauschten Zeilen lautet
0 1 1 1 0
1 2 4 2 1
Diese enthält die neue Zeile unten und die vorherige Zeile mit Nullen.
Nochmaliges Wickeln ergibt
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
Das Nehmen der letzten zwei getauschten Reihen gibt
0 1 2 4 2 1 0
1 3 8 9 8 3 1
Nach den r
Iterationen ist die Ausgabe in der letzten Zeile der endgültigen Matrix enthalten. Zum Beispiel wäre für c = 2
(0-basiert) das Ergebnis 8
. Anstatt die letzte Zeile und die gewünschte Spalte zu indizieren, kann ein Trick verwendet werden, der die Symmetrie jeder Zeile ausnutzt : Die endgültige Matrix wird transponiert
0 1
1 3
2 8
4 9
2 8
1 3
0 1
und sein -c
-tes Element wird genommen. Dies verwendet die lineare Indizierung, das heißt, die Matrix wird durch einen einzelnen Index in der Reihenfolge des Spaltenhauptteils indiziert . Da die Indizierung modular ist , befindet sich der 0
-Eintrag in der unteren rechten Ecke (Wert 1
) und der -2
-te Eintrag in zwei Schritten oberhalb (Wert 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