MATL , 30 28 27 bytes
t:P"@:s:@/Xk&+@+8MPt&(]30+c
Pruébalo en línea!
Caracteristicas adicionales:
Para 26 bytes , la siguiente versión modificada produce una salida gráfica :
t:P"@:s:@/Xk&+@+8MPt&(]1YG
¡Pruébalo en MATL Online!
La imagen está pidiendo algo de color , y solo cuesta 7 bytes:
t:P"@:s:@/Xk&+@+8MPt&(]1YG59Y02ZG
¡Pruébalo en MATL Online!
O use una versión más larga (37 bytes) para ver cómo se construye gradualmente la matriz de caracteres :
t:P"@:s:@/Xk&+@+8MPt&(t30+cD9&Xx]30+c
¡Pruébalo en MATL Online!
Salidas de ejemplo
Para la entrada es 8
, lo siguiente muestra la versión básica, la salida gráfica y la salida gráfica en color.
Explicación
Procedimiento general
Se construye una matriz numérica desde las capas externas a las internas en N
pasos, donde N
está la entrada. Cada paso sobrescribe una parte interna (superior izquierda) de la matriz anterior. Al final, los números en la matriz obtenida se cambian a caracteres.
Ejemplo
Para la entrada, 4
la primera matriz es
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
Como segundo paso, la matriz
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
se sobrescribe en la mitad superior de este último. Entonces lo mismo se hace con
6 5 5
5 4 4
5 4 4
y finalmente con
3
La matriz resultante es
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
Por último, 30
se agrega a cada entrada y los números resultantes se interpretan como puntos de código y se convierten en caracteres (comenzando en 33
, correspondiente a !
).
Construcción de las matrices intermedias.
Para la entrada N
, considere disminuir los valores de k
desde N
a 1
. Para cada uno k
, se genera un vector de enteros de 1
a k*(k+1)
, y luego cada entrada se divide k
y se redondea. Como ejemplo, para k=4
esto da (todos los bloques tienen tamaño k
excepto el último):
1 1 1 1 2 2 2 2 3 3
mientras que para k=3
el resultado sería (todos los bloques tienen tamaño k
):
1 1 1 2 2 2
Este vector se agrega, en cuanto a elementos con difusión, a una copia transpuesta de sí mismo; y luego k
se agrega a cada entrada. Para k=4
esto da
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
Esta es una de las matrices intermedias que se muestran arriba, excepto que se voltea horizontal y verticalmente. Entonces, todo lo que queda es voltear esta matriz y escribirla en la esquina superior izquierda de la matriz "acumulada" hasta ahora, inicializada en una matriz vacía para el primer ( k=N
) paso.
Código
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