MATL , 30 28 27 byte
t:P"@:s:@/Xk&+@+8MPt&(]30+c
Provalo online!
Caratteristiche bonus:
Per 26 byte , la seguente versione modificata produce un output grafico :
t:P"@:s:@/Xk&+@+8MPt&(]1YG
Provalo su MATL Online!
L'immagine richiede un po 'di colore e costa solo 7 byte:
t:P"@:s:@/Xk&+@+8MPt&(]1YG59Y02ZG
Provalo su MATL Online!
Oppure usa una versione più lunga (37 byte) per vedere come viene gradualmente costruita la matrice di caratteri :
t:P"@:s:@/Xk&+@+8MPt&(t30+cD9&Xx]30+c
Provalo su MATL Online!
Esempi di output
Per input è 8
, quanto segue mostra la versione di base, l'output grafico e l'output grafico a colori.
Spiegazione
Procedura generale
Una matrice numerica è costruita dagli strati esterni a quelli interni a N
passi, dove si N
trova l'input. Ogni passaggio sovrascrive una parte interna (in alto a sinistra) della matrice precedente. Alla fine, i numeri nella matrice ottenuta vengono cambiati in caratteri.
Esempio
Per input 4
la prima matrice è
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
Come secondo passo, la matrice
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
viene sovrascritto nella metà superiore di quest'ultimo. Quindi lo stesso viene fatto
6 5 5
5 4 4
5 4 4
e infine con
3
La matrice risultante è
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
Infine, 30
viene aggiunto a ciascuna voce e i numeri risultanti vengono interpretati come punti di codice e convertiti in caratteri (iniziando così da 33
, corrispondente a !
).
Costruzione delle matrici intermedie
Per l'input N
, considerare la riduzione dei valori di k
da N
a 1
. Per ciascuno k
, viene generato un vettore di numeri interi da 1
a k*(k+1)
, quindi ciascuna voce viene divisa k
e arrotondata per eccesso. Ad esempio, per k=4
questo dà (tutti i blocchi hanno dimensioni k
tranne l'ultimo):
1 1 1 1 2 2 2 2 3 3
mentre per k=3
il risultato sarebbe (tutti i blocchi hanno dimensioni k
):
1 1 1 2 2 2
Questo vettore viene aggiunto, in termini di elementi con trasmissione, a una copia trasposta di se stesso; e quindi k
viene aggiunto a ciascuna voce. Per k=4
questo dà
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
Questa è una delle matrici intermedie mostrate sopra, tranne per il fatto che viene capovolta orizzontalmente e verticalmente. Quindi non resta che capovolgere questa matrice e scriverla nell'angolo in alto a sinistra della matrice "accumulata" finora, inizializzata su una matrice vuota per il primo ( k=N
) passaggio.
Codice
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