Entrada:
Una cuerda
Salida:
1) Primero tomamos eliminar el carácter al final de la cadena de entrada hasta que nos queda una longitud que es un cuadrado (es decir, 1, 4, 9, 16, 25, 36, etc.)
Entonces abcdefghijklmnopqrstuvwxyz
(longitud 26) se convierte en abcdefghijklmnopqrstuvwxy
( longitud 25).
2) Luego colocamos esto en un cuadrado, una línea a la vez, de izquierda a derecha:
abcde
fghij
klmno
pqrst
uvwxy
3) Lo doblamos en las cuatro direcciones, de esta manera (seguimos desplegando hasta que el 'bloque' plegado exterior ya no tiene caracteres internos para desplegar):
m
qrs
l n
ghi
abcde
ihgf jihg
mn lk on lm
srqp tsrq
uvwxy
qrs
l n
ghi
m
Algunas cosas a tener en cuenta, cuando nos plegamos hacia afuera, básicamente reflejamos así (números agregados como aclaración, que representa los 'índices' en estos ejemplos):
Cuando doblamos el lado izquierdo:
123 to: 321 123
fghij ihgf j
Cuando doblamos el lado derecho:
123 to: 123 321
fghij f jihg
Cuando nos plegamos hacia arriba:
3q
2l
1g
b to: b
1g 1
2l 2
3q 3
v v
Cuando nos plegamos hacia abajo:
b b
1g 1
2l 2
3q 3
v to: v
3q
2l
1g
Reglas de desafío:
- Puede suponer que la entrada siempre tendrá al menos 1 carácter (que también será la salida).
- El formato de salida es flexible, por lo que puede imprimir en STDOUT o STDERR; regresar como string-array / list o character 2D-array; cadena simple con líneas nuevas; etc.
- La entrada solo contendrá caracteres alfanuméricos (
a-zA-Z0-9
) - También puede usar un carácter no alfanumérico para llenar los espacios en y / o alrededor de la salida de arte ASCII, como un punto
.
. - Los espacios finales y una nueva línea final son opcionales.
- Continuamos desplegándonos hasta que el 'bloque' plegado exterior no tenga más centros para desplegar.
Reglas generales:
- Este es el código de golf , por lo que la respuesta más corta en bytes gana.
No permita que los lenguajes de código de golf lo desalienten de publicar respuestas con idiomas que no sean de código. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación. - Se aplican reglas estándar para su respuesta, por lo que puede utilizar STDIN / STDOUT, funciones / método con los parámetros adecuados y programas completos de tipo retorno. Tu llamada.
- Las lagunas predeterminadas están prohibidas.
- Si es posible, agregue un enlace con una prueba para su código.
- Además, agregue una explicación si es necesario.
Casos de prueba:
Input: abcdefghijklmnopqrstuvwxy
Output:
m
qrs
l n
ghi
abcde
ihgf jihg
mn lk on lm
srqp tsrq
uvwxy
qrs
l n
ghi
m
Input: A
Ouput:
A
Input: ThisIsATest
Output:
I
Thi
Is sI
ATe
I
Input: HowAboutAVeryLongExampleWhichIsAlsoAnEvenSquareInsteadOfOddOneAndExceeds64Chars
Output:
An
ch
xamp
i I
o E
quar
steadO
S e
s v
h s
E l
VeryLo
HowAbout
oLyreVA noLyreV
xampl Eg el Examp
hci Is hW As hi Ihc
nAo Ev sl ev so EnA
quare Sn Ie Squar
Odaetsn fOdaets
OddOneAn
steadO
S e
s v
h s
E l
VeryLo
xamp
i I
o E
quar
An
ch
Input: Lenght7
Output:
Le
ng
Input: abc
Output:
a
Respuestas:
SOGL V0.12 , 75 bytes
Pruébalo aquí!
Esto espera la entrada en la pila, por lo que, para facilitar su uso, agregué
,
al principio. Eso puede causar problemas si la entrada contiene solo números, así que aquí hay un conjunto de pruebas para eso.70 bytes
√lH»{ā;l⁾:A∫Ba{bIwFIWhFbž;FIbI@ž}};}¹K⁴{ē2\⌡±e{@Κ};⁴┼┼};0E{ē2\⌡№:h++}╚
también funcionan, pero como ahora solo implementé√
en cadenas y la documentación no mencionó que ocuparía la longitud, no lo contaré.Explicación:
fuente
√
solo funcionaba con números. La razón por la que no estoy contando la versión de 75 bytes es porque siento que cae bajo el resquicio de la adición de un built-in sólo para un desafíoDe carbón ,
120109 bytesPruébalo en línea! Tenga en cuenta que
A
desde entonces se ha cambiado a≔
y el enlace refleja esto. Explicación:Calcula
h = int(sqrt(len(q)))
. (Floor
aún no se había implementado ...)Extrae los
h
segmentos de longitudh
de la entrada. (En realidad, no me molesto en truncar los cortes a la longitudh
). Utilizo unfor
bucle en lugar de aMap
porque necesitoAssign
el resultado deMap
alguna parte y esto no es trivial cuando trato con aSlice
.El despliegue ocurre 4 veces, una vez para cada dirección (abajo, derecha, arriba, izquierda según lo codificado). La variable de bucle para este bucle es
i
.Tome una copia de la cadena en rodajas.
Vuelva al origen del lienzo para que cada despliegue comience con el cuadrado
h
-por-h
en el mismo lugar.Repetir
(h+1)/2
tiempos; una para cada despliegue, más una vez para el cuadrado original. La variable de bucle para este bucle esk
.Repita 4 veces, una vez para cada lado del cuadrado desplegado. (No uso la variable de bucle
l
).Imprima un lado del cuadrado desplegado. Dado que este es el
k
th despliegue, el lado del cuadrado esh-2k
y aleja a los personajesk
del borde del cuadrado original.Pivote listo para imprimir el siguiente lado del cuadrado.
Gire la cuerda en rodajas. (Sí, eso es
ξ
. ¡No lo uso a menudo!)Eη
También funcionaría para el exteriorMap
. La rotación también tiene el conveniente efecto secundario de truncar el ancho de la matrizh
.Después de imprimir el lado, el cursor se mueve fuera del borde del cuadrado. Imprimir un personaje menos falla para los cuadrados del lado 1 y, de todos modos, es menos golfoso. Habiendo pivotado previamente, la impresión de una nueva línea mueve convenientemente el cursor hacia la esquina.
Voltee el cuadrado vertical u horizontalmente según corresponda.
Calcule el desplazamiento al siguiente despliegue.
Muévase horizontal o verticalmente al siguiente despliegue según corresponda.
Aquí hay un enlace a la versión de 97 bytes obtenida haciendo uso de todas las características más recientes de Charcoal, que incluyen
Floor
: ¡ Pruébelo en línea! El enlace es a la versión detallada del código.fuente