MATL , 30 28 27 octets
t:P"@:s:@/Xk&+@+8MPt&(]30+c
Essayez-le en ligne!
Bonus caractéristiques:
Pour 26 octets , la version modifiée suivante génère une sortie graphique :
t:P"@:s:@/Xk&+@+8MPt&(]1YG
Essayez-le sur MATL Online!
L'image demande de la couleur et ne coûte que 7 octets:
t:P"@:s:@/Xk&+@+8MPt&(]1YG59Y02ZG
Essayez-le sur MATL Online!
Ou utilisez une version plus longue (37 octets) pour voir comment la matrice de caractères est construite progressivement :
t:P"@:s:@/Xk&+@+8MPt&(t30+cD9&Xx]30+c
Essayez-le sur MATL Online!
Exemple de sorties
Pour l'entrée is 8
, voici la version de base, la sortie graphique et la sortie graphique couleur.
Explication
Procédure générale
Une matrice numérique est construite par N
étapes des couches externe vers interne .N
se les entrées. Chaque étape remplace une partie interne (en haut à gauche) de la matrice précédente. A la fin, les nombres dans la matrice obtenue sont changés en caractères.
Exemple
Pour entrer 4
la première matrice est
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
Dans un deuxième temps, 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
est écrasé dans la moitié supérieure de ce dernier. Puis on fait la même chose avec
6 5 5
5 4 4
5 4 4
et enfin avec
3
La matrice résultante est
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
Enfin, 30
est ajouté à chaque entrée et les nombres résultants sont interprétés comme des points de code et convertis en caractères (commençant ainsi à 33
, correspondant à !
).
Construction des matrices intermédiaires
Pour la saisie N
, considérez les valeurs décroissantes de k
de N
à 1
. Pour chacune d'elles k
, un vecteur d'entiers allant de 1
à k*(k+1)
est généré, puis chaque entrée est divisée par k
et arrondie. Par exemple, pour k=4
cela donne (tous les blocs ont une taille k
sauf le dernier):
1 1 1 1 2 2 2 2 3 3
alors que pour k=3
le résultat serait (tous les blocs ont une taille k
):
1 1 1 2 2 2
Ce vecteur est ajouté élément par émission avec une copie transposée de lui-même; et k
est ensuite ajouté à chaque entrée. Pour k=4
cela donne
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
C'est l'une des matrices intermédiaires montrées ci-dessus, sauf qu'elle est retournée horizontalement et verticalement. Il ne reste donc qu’à retourner cette matrice et à l’écrire dans le coin supérieur gauche de la matrice "accumulée" jusqu’à présent, initialisée en une matrice vide pour la première k=N
étape ( ).
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