MATL , 22 20 19 bajtów
Ti:"2Y6Y+FT_Y)]!i_)
Oba wejścia są oparte na 0.
Wypróbuj online!
Wyjaśnienie
Niech r
i c
oznacz dwa dane wejściowe, określając odpowiednio wiersz i kolumnę oparte na 0.
Każdy nowy rząd w rombu Pascala może być zbudowany z matrycy zawierającej dwa poprzednie wiersze przez splatanie z jądrem [1 1 1; 0 1 0]
i utrzymanie dwóch ostatnich rzędów wyniku zamienione. Robi się to r
razy, zaczynając od matrycy 1
.
Okazuje się, że użycie jądra [0 1 0; 1 1 1; 0 1 0]
, które jest predefiniowanym dosłownie, jest krótsze . Daje to dodatkowy rząd, który zostanie odrzucony.
Rozważmy na przykład r = 3
, więc są 3
iteracje.
Zaczynając od
1
splot [0 1 0; 1 1 1; 0 1 0]
daje
0 1 0
1 1 1
0 1 0
Zachowanie dwóch ostatnich wierszy (w tym przypadku całej macierzy) i ich zamiana daje
0 1 0
1 1 1
Splot powyższego z [0 1 0; 1 1 1; 0 1 0]
daje
0 0 1 0 0
0 1 1 1 0
1 2 4 2 1
0 1 1 1 0
Macierz utworzona przez zamienione dwa ostatnie rzędy to
0 1 1 1 0
1 2 4 2 1
Zawiera on nowy wiersz u dołu, a poprzedni przedłużony zerami.
Ponowne rozmycie daje
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
Biorąc dwa ostatnie zamienione wiersze daje
0 1 2 4 2 1 0
1 3 8 9 8 3 1
Po zakończeniu r
iteracji dane wyjściowe są zawarte w ostatnim wierszu ostatniej macierzy. Na przykład dla c = 2
(na podstawie 0) wynik byłby 8
. Zamiast indeksować ostatni wiersz i żądaną kolumnę, można zastosować lewę, która wykorzystuje symetrię każdego rzędu: ostatnia macierz jest transponowana
0 1
1 3
2 8
4 9
2 8
1 3
0 1
i jego -c
-ty element jest brany. Wykorzystuje to indeksowanie liniowe, to znaczy macierz jest indeksowana jednym indeksem w porządku głównym kolumny . Ponieważ indeksowanie jest modułowe , 0
-wejście jest prawym dolnym rogiem (wartość 1
), a -2
-ty wpis to dwa kroki powyżej (wartość 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