MATL , 22 20 19 bayt
Ti:"2Y6Y+FT_Y)]!i_)
Her iki giriş de 0 tabanlıdır.
Çevrimiçi deneyin!
açıklama
Izin vermek r
ve c
sırayla 0 tabanlı satır ve sütun belirterek, iki giriş belirtiniz.
Pascal'ın eşkenar dörtgenindeki her yeni satır , çekirdekle birlikte dönerek[1 1 1; 0 1 0]
ve sonucun son iki sırasını değiştirerek önceki iki satırı içeren matristen oluşturulabilir . Bu, r
matristen başlayarak yapılır 1
.
[0 1 0; 1 1 1; 0 1 0]
Önceden tanımlanmış bir hazır bilgi olan çekirdeği kullanmak daha kısa çıkıyor . Bu, atılacak ekstra bir satır oluşturur.
Örneğin düşünün r = 3
, bu yüzden 3
tekrarlar var.
Den başlayarak
1
evrişim [0 1 0; 1 1 1; 0 1 0]
verir
0 1 0
1 1 1
0 1 0
Son iki satırı tutmak (bu durumda tüm matris) ve bunları değiştirmek
0 1 0
1 1 1
Yukarıdakilerin [0 1 0; 1 1 1; 0 1 0]
verir ile konvolüsyonu
0 0 1 0 0
0 1 1 1 0
1 2 4 2 1
0 1 1 1 0
Değiştirilen son iki satırdan oluşan matris
0 1 1 1 0
1 2 4 2 1
Bu, alttaki yeni satırı ve birincisi sıfırlarla genişletilmiş içerir.
Tekrar kıvrım kazandırır
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
Değiştirilen son iki satırı almak
0 1 2 4 2 1 0
1 3 8 9 8 3 1
r
Yinelemeler yapıldıktan sonra, çıktı son matrisin son satırında bulunur. Örneğin, c = 2
(0 tabanlı) için sonuç olur 8
. Son sırayı ve istenen sütunu indekslemek yerine, her sıranın simetrisinden yararlanan bir hile kullanılabilir : son matris transpoze edilir
0 1
1 3
2 8
4 9
2 8
1 3
0 1
ve onun -c
elementi alınır. Olan bu kullanımlar doğrusal indeksleme, matris tarafından dizine tek bir indeks olarak sütun büyük için. İndeksleme modüler olduğundan, 0
-giriş sağ alt köşedir (değer 1
) ve- -2
giriş iki adımdan (değer 8
) yüksektir .
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