MATL , 30 28 27 Bytes
t:P"@:s:@/Xk&+@+8MPt&(]30+c
Probieren Sie es online!
Bonusmaterial:
Für 26 Bytes erzeugt die folgende modifizierte Version eine grafische Ausgabe :
t:P"@:s:@/Xk&+@+8MPt&(]1YG
Probieren Sie es bei MATL Online!
Das Bild verlangt nach etwas Farbe und kostet nur 7 Bytes:
t:P"@:s:@/Xk&+@+8MPt&(]1YG59Y02ZG
Probieren Sie es bei MATL Online!
Oder verwenden Sie eine längere Version (37 Byte), um zu sehen, wie die Zeichenmatrix schrittweise aufgebaut wird :
t:P"@:s:@/Xk&+@+8MPt&(t30+cD9&Xx]30+c
Probieren Sie es bei MATL Online!
Beispielausgaben
Für die Eingabe wird 8
im Folgenden die Grundversion, die grafische Ausgabe und die grafische Farbausgabe angezeigt.
Erläuterung
Allgemeines Verfahren
Eine numerische Matrix wird in N
Schritten von der äußeren zur inneren Ebene erstellt, wobei N
die Eingabe erfolgt. Jeder Schritt überschreibt einen inneren (oben links) Teil der vorherigen Matrix. Am Ende werden die Zahlen in der erhaltenen Matrix in Zeichen geändert.
Beispiel
Für die Eingabe ist 4
die erste Matrix
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
In einem zweiten Schritt wird die Matrix
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
wird in die obere Hälfte des letzteren überschrieben. Dann ist das selbe erledigt mit
6 5 5
5 4 4
5 4 4
und schließlich mit
3
Die resultierende Matrix ist
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
Zuletzt 30
wird zu jedem Eintrag hinzugefügt und die resultierenden Zahlen werden als Codepunkte interpretiert und in Zeichen umgewandelt (also beginnend bei 33
, entsprechend !
).
Konstruktion der Zwischenmatrizen
N
Berücksichtigen Sie bei der Eingabe abnehmende Werte k
von N
bis 1
. Für jedes k
wird ein Vektor von ganzen Zahlen von 1
bis k*(k+1)
erzeugt, und dann wird jeder Eintrag durch dividiert k
und aufgerundet. Als Beispiel k=4
gibt dies an (alle Blöcke haben eine Größe mit k
Ausnahme des letzten):
1 1 1 1 2 2 2 2 3 3
während für k=3
das Ergebnis wäre (alle Blöcke haben Größe k
):
1 1 1 2 2 2
Dieser Vektor wird elementweise mit Broadcast zu einer transponierten Kopie von sich selbst hinzugefügt; und wird dann k
zu jedem Eintrag hinzugefügt. Dafür k=4
gibt es
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
Dies ist eine der oben gezeigten Zwischenmatrizen, mit der Ausnahme, dass sie horizontal und vertikal gespiegelt wird. Alles was übrig bleibt ist, diese Matrix umzudrehen und in die obere linke Ecke der "akkumulierten" Matrix zu schreiben, die für den ersten ( k=N
) Schritt zu einer leeren Matrix initialisiert wurde.
Code
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