Esta pregunta está inspirada en la pregunta de Kevin Cruijssen .
Ahora que la alfombra está tendida, queremos enrollarla. Su tarea es escribir un programa que tome una cadena y devuelva una espiral hecha de esta cadena (que representa una alfombra enrollada vista desde el lado).
El procedimiento para un paso de rodar la alfombra es el siguiente. Hay un ejemplo para ilustrar lo que quiero decir. Observe que el ejemplo comienza con una alfombra parcialmente enrollada para una mejor comprensión:
ac
rpet
- separe la "cabeza" de la "cola" de la alfombra: la cabeza es lo que se ha enrollado hasta ahora, la cola es lo que queda por enrollar.
Head: ac Tail:
rp et
- Gire la cabeza 90 °, en sentido horario.
Rotated head: ra Tail (unchanged):
pc et
- si el ancho de la nueva cabeza (aquí
2
) es menor o igual que la longitud de la cola (aquí2
)- luego, póngalo encima de la cola
- de lo contrario, la alfombra (como estaba al comienzo del paso) estaba enrollada
New carpet: ra
pc
et
Repita el procedimiento tantas veces como sea necesario.
Dos ejemplos que muestran todos los pasos de la alfombra rodando:
carpet
c
arpet
ac
rpet
ra
pc
et
0123456789
0
123456789
10
23456789
21
30
456789
432
501
6789
Algunas precisiones:
- No necesita mostrar todos los pasos intermedios, solo la alfombra enrollada (por ejemplo, si encuentra una manera no iterativa de calcular el resultado, es perfecto). Además, no necesita imprimir ningún espacio en blanco inicial, en los ejemplos anteriores, solo les muestro para alinear cosas.
- La entrada es una cadena, una lista / matriz de caracteres
- La salida se imprime en stdout o en un archivo.
- La entrada es buena: la longitud es de al menos 1 carácter, y como máximo una constante lo suficientemente pequeña como para que no cause problemas, pero no puede usar esa constante en su programa; el contenido de la cadena son solo caracteres agradables ([a-zA-Z0-9]), que codifica según su preferencia.
- Este es el código de golf , por lo que la respuesta más corta en bytes gana. No permita que los lenguajes de code-golf lo desanimen a publicar respuestas con lenguajes que no sean codegolf. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación.
- 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 para su respuesta si cree que es necesaria.
ProgrammingPuzzlesAndCodeGolf
- la longitud final de la cola mayor que 1 me hizo tropezar.print
dentro de alambda
.Respuestas:
Carbón de leña , 15 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Pase sobre la alfombra.
Comprueba si hay algo encima del cursor.
Si no, entonces ruede la alfombra.
Mover a la derecha y generar el carácter actual.
Ejemplo: para la entrada
0123456789
, se producen las siguientes acciones:0
está impreso.El cursor se mueve hacia la derecha y
1
se imprime.Como no hay nada encima
1
, el lienzo se gira.El cursor se mueve hacia la derecha y
2
se imprime.Como no hay nada encima
2
, el lienzo se gira.El cursor se mueve hacia la derecha y
3
se imprime.El cursor se mueve hacia la derecha y
4
se imprime.Como no hay nada encima
4
, el lienzo se gira.El cursor se mueve hacia la derecha y
5
se imprime.El cursor se mueve hacia la derecha y
6
se imprime.Como no hay nada encima
6
, el lienzo se gira.El cursor se mueve hacia la derecha y
7
se imprime.El cursor se mueve hacia la derecha y
8
se imprime.El cursor se mueve hacia la derecha y
9
se imprime.fuente
⟲
?Pyth, 37 bytes
Pruébelo en línea aquí , o verifique todos los casos de prueba a la vez aquí .
fuente
Casco , 24 bytes
Pruébalo en línea!
Explicación
fuente
J , 69 bytes
-3 bytes gracias a FrownyFrog
Pruébalo en línea!
explicación
El algoritmo es sencillo a pesar de ser un poco detallado para J.
Estrategia general: reduzca la entrada a una tabla cuadrada, con una pieza sobrante (posiblemente vacía).
A medida que reduzcamos, utilizaremos una lista de cuadros de 2 elementos. Nuestro "resultado hasta ahora" será la primera casilla, y los "elementos restantes para procesar" serán la segunda casilla. El primer cuadro se inicializará en el encabezado de la entrada (pero se convertirá en una tabla):
y "los elementos que quedan por procesar" serán la cola de la entrada:
Ahora tenemos:
donde la 'c' es en realidad una tabla 1x1.
Lo reducimos usando un bucle J Do ... While:
Donde la parte entre paréntesis es la condición de "seguir adelante":
que dice "continúe mientras la longitud del cuadro derecho es mayor o igual que la longitud del cuadro izquierdo (es decir, la longitud lateral de la matriz cuadrada)
¿Qué significa "seguir adelante"? Eso se define en el verbo a la izquierda del primero
^:
, que nos dice cómo tomar el resultado actual y producir la siguiente iteración. Ese verbo es:Vamos a desglosarlo:
Es decir, esto es solo un algoritmo descrito en el OP traducido literalmente a J.
Finalmente nos ocupamos de los (posiblemente 0) elementos sobrantes, la cola de nuestro rollo de alfombra:
Esto dice "toma todo menos el último olmo del resultado":
y añádelo a
,
los últimos elementos del resultado{:@[
con los elementos restantes agregados a ese último elemento, ]
fuente
,.
puede hacer lo que1 1$]
hace y$
puede usarse como{.
.$ can be used as {.
, ¿puede aclararlo?R ,
146132 bytesPruébalo en línea!
Implementa el procedimiento de laminado de alfombras. Toma la entrada como una lista de caracteres e imprime en stdout.
Guardado 14 bytes por encontrar una manera de utilizar un
do-while
bucle e inicializar utilizandoF
.fuente
Jalea , 30 bytes
Parece demasiado largo ...
Pruébalo en línea!
¿Cómo?
fuente
05AB1E , 41 bytes
Demasiado tiempo, pero quería usar el Canvas ... lo cual probablemente fue una mala elección ahora que lo terminé y resultó ser tan largo ...
Pruébalo en línea . (No hay una suite de prueba, porque parece haber un problema extraño con el
.Λ
incorporado ...)Explicación:
Permítanme comenzar dando una explicación general del Canvas y lo que quería que lograra mi código. Se puede encontrar información más detallada en este consejo relevante de 05AB1E , pero para este desafío quería hacer lo siguiente:
El lienzo incorporado toma tres parámetros:
[2,2,3,3,4,4,5,5,...]
carpet
0123456789ABCDEFGHI
En cuanto al código:
Ver este consejo 05AB1E mío (sección Cómo comprimir grandes números enteros? ) Para entender por qué
Ž8O
es2064
.fuente
Python 3 , 112 bytes
En este caso, la salida es el valor de la función.
Pruébalo en línea!
Si lo prefiere, aquí hay otra solución (más larga, 129 bytes ) que imprime directamente la entrada enrollada:
Pruébalo en línea!
fuente
MATLAB / Octave , 154 bytes
No es el más corto, pero jugar al golf en MATLAB / Octave siempre es divertido :)
Pruébalo en línea!
fuente
disp
, yo diría que debe retirar eldisp
dejar que la gente que no saben R que hace escribir en STDOUT por defecto