MATL , 30 28 27 byte
t:P"@:s:@/Xk&+@+8MPt&(]30+c
Cobalah online!
Fitur bonus:
Untuk 26 byte , versi modifikasi berikut menghasilkan output grafis :
t:P"@:s:@/Xk&+@+8MPt&(]1YG
Cobalah di MATL Online!
Gambar memohon beberapa warna , dan harganya hanya 7 byte:
t:P"@:s:@/Xk&+@+8MPt&(]1YG59Y02ZG
Cobalah di MATL Online!
Atau gunakan versi yang lebih panjang (37 byte) untuk melihat bagaimana matriks karakter dibangun secara bertahap :
t:P"@:s:@/Xk&+@+8MPt&(t30+cD9&Xx]30+c
Cobalah di MATL Online!
Keluaran contoh
Untuk input 8
, berikut ini menunjukkan versi dasar, output grafis, dan output grafis warna.
Penjelasan
Prosedur umum
Matriks numerik dibangun dari lapisan luar ke dalam dalam N
langkah-langkah, di mana N
inputnya. Setiap langkah menimpa bagian dalam (kiri-atas) dari matriks sebelumnya. Pada akhirnya, angka-angka dalam matriks yang diperoleh diubah menjadi karakter.
Contoh
Untuk input 4
, matriks pertama adalah
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
Sebagai langkah kedua, matriks
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
ditimpa ke bagian atas yang terakhir. Kemudian hal yang sama dilakukan dengan
6 5 5
5 4 4
5 4 4
dan akhirnya dengan
3
Matriks yang dihasilkan adalah
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
Terakhir, 30
ditambahkan ke setiap entri dan angka yang dihasilkan diinterpretasikan sebagai codepoint dan dikonversi ke karakter (dengan demikian dimulai dari 33
, sesuai dengan !
).
Konstruksi matriks perantara
Untuk input N
, pertimbangkan penurunan nilai k
dari N
ke 1
. Untuk masing-masing k
, vektor bilangan bulat dari 1
ke k*(k+1)
dihasilkan, dan kemudian setiap entri dibagi dengan k
dan dibulatkan ke atas. Sebagai contoh, untuk k=4
ini memberi (semua blok memiliki ukuran k
kecuali yang terakhir):
1 1 1 1 2 2 2 2 3 3
sedangkan untuk k=3
hasilnya adalah (semua blok memiliki ukuran k
):
1 1 1 2 2 2
Vektor ini ditambahkan, elemen-bijaksana dengan siaran, ke salinan dirinya sendiri; dan kemudian k
ditambahkan ke setiap entri. Untuk k=4
ini memberi
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
Ini adalah salah satu dari matriks perantara yang ditunjukkan di atas, kecuali bahwa ia dibalik secara horizontal dan vertikal. Jadi yang tersisa adalah membalikkan matriks ini dan menuliskannya di sudut kiri atas matriks "terakumulasi" sejauh ini, diinisialisasi ke matriks kosong untuk langkah pertama ( k=N
).
Kode
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