MATL , 30 28 27 bayt
t:P"@:s:@/Xk&+@+8MPt&(]30+c
Çevrimiçi deneyin!
Bonus özellikler:
İçin 26 bayt , aşağıdaki değiştirilmiş versiyonu üretir grafik çıktısı :
t:P"@:s:@/Xk&+@+8MPt&(]1YG
MATL Online'da deneyin !
Görüntü biraz renk için yalvarıyor ve yalnızca 7 bayta mal oluyor:
t:P"@:s:@/Xk&+@+8MPt&(]1YG59Y02ZG
MATL Online'da deneyin !
Veya karakter matrisinin aşamalı olarak nasıl oluşturulduğunu görmek için daha uzun bir sürüm (37 bayt) kullanın :
t:P"@:s:@/Xk&+@+8MPt&(t30+cD9&Xx]30+c
MATL Online'da deneyin !
Örnek çıktılar
Giriş için 8
, aşağıda temel sürüm, grafik çıktı ve renkli grafik çıktı gösterilmektedir.
açıklama
Genel prosedür
Sayısal bir matris, girişin N
olduğu adımlarla dıştan iç katmanlara oluşturulur N
. Her adım önceki matrisin iç (sol üst) kısmının üzerine yazar. Sonunda, elde edilen matristeki sayılar karakter olarak değiştirilir.
Örnek
Giriş 4
için ilk matris
10 10 9 9 9 9 8 8 8 8
10 10 9 9 9 9 8 8 8 8
9 9 8 8 8 8 7 7 7 7
9 9 8 8 8 8 7 7 7 7
9 9 8 8 8 8 7 7 7 7
9 9 8 8 8 8 7 7 7 7
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
İkinci adım olarak, matris
7 7 7 6 6 6
7 7 7 6 6 6
7 7 7 6 6 6
6 6 6 5 5 5
6 6 6 5 5 5
6 6 6 5 5 5
ikincisinin üst yarısına yazılır. Sonra aynı ile yapılır
6 5 5
5 4 4
5 4 4
ve sonunda
3
Elde edilen matris
3 5 5 6 6 6 8 8 8 8
5 4 4 6 6 6 8 8 8 8
5 4 4 6 6 6 7 7 7 7
6 6 6 5 5 5 7 7 7 7
6 6 6 5 5 5 7 7 7 7
6 6 6 5 5 5 7 7 7 7
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
Son olarak, 30
her girişe eklenir ve sonuçta elde edilen sayılar kod noktaları olarak yorumlanır ve karakterlere dönüştürülür (böylece başlar 33
, buna karşılık gelir !
).
Ara matrislerin inşaatı
Girişi için N
, değerlerini düşürebilirler k
gelen N
etmek 1
. Her biri için k
, gelen tamsayılar bir vektör 1
ile k*(k+1)
oluşturulur, ve daha sonra her bir giriş bölünür k
ve yuvarlanır. Örnek olarak, bunun için k=4
( k
son hariç hariç tüm blokların büyüklüğü vardır ):
1 1 1 1 2 2 2 2 3 3
için ise k=3
sonuç (tüm bloklar boyutuna sahip olacaktır k
):
1 1 1 2 2 2
Bu vektör, yayınlanmış olarak eleman şeklinde, kendisinin aktarılmış bir kopyasına eklenir; ve sonra k
her girişe eklenir. Bunun için k=4
verir
6 6 6 6 7 7 7 7 8 8
6 6 6 6 7 7 7 7 8 8
6 6 6 6 7 7 7 7 8 8
6 6 6 6 7 7 7 7 8 8
7 7 7 7 8 8 8 8 9 9
7 7 7 7 8 8 8 8 9 9
7 7 7 7 8 8 8 8 9 9
7 7 7 7 8 8 8 8 9 9
8 8 8 8 9 9 9 9 10 10
8 8 8 8 9 9 9 9 10 10
Bu, yatay ve dikey olarak çevrilmesi dışında yukarıda gösterilen ara matrislerden biridir. Geriye kalan tek şey, bu matrisi çevirip şimdiye kadar "birikmiş" matrisin sol üst köşesine yazmak ve ilk ( k=N
) basamağı için boş bir matrise başlatılması .
kod
t % Implicitly input N. Duplicate. The first copy of N serves as the
% initial state of the "accumulated" matrix (size 1×1). This will be
% extended to size N*(N+1)/2 × N*(N+1)/2 in the first iteration
:P % Range and flip: generates vector [N, N-1, ..., 1]
" % For each k in that vector
@: % Push vector [1, 2, ..., k]
s % Sum of this vector. This gives 1+2+···+k = k*(k+1)/2
: % Range: gives vector [1, 2, ..., k*(k+1)/2]
@/ % Divide each entry by k
Xk % Round up
&+ % Add vector to itself transposed, element-wise with broadcast. Gives
% a square matrix of size k*(k+1)/2 × k*(k+1)/2
@+ % Add k to each entry of the this matrix. This is the flipped
% intermediate matrix
8M % Push vector [1, 2, ..., k*(k+1)/2] again
Pt % Flip and duplicate. The two resulting, equal vectors are the row and
% column indices where the generated matrix will be written. Note that
% flipping the indices has the same effect as flipping the matrix
% horizontally and vertically (but it's shorter)
&( % Write the (flipped) intermediate matrix into the upper-left
% corner of the accumulated matrix, as given by the two (flipped)
% index vectors
] % End
30+ % Add 30 to each entry of the final accumulated matrix
c % Convert to char. Implicitly display