Dada una lista de al menos dos palabras (hechas solo con letras minúsculas), construya y muestre una escalera ASCII de las palabras alternando la dirección de escritura primero a la derecha, luego a la izquierda, relativamente a la dirección inicial de izquierda a derecha .
Cuando termine de escribir una palabra, cambie la dirección y solo entonces comience a escribir la siguiente palabra.
Si su idioma no admite listas de palabras, o es más conveniente para usted, puede tomar la entrada como una cadena de palabras, separadas por un solo espacio.
Se permiten espacios en blanco iniciales y finales.
["hello", "world"]
o "hello world"
hello
w
o
r
l
d
Aquí comenzamos escribiendo hello
y cuando llegamos a la siguiente palabra (o en el caso de la entrada como una cadena, se encuentra un espacio), cambiamos la dirección relativa a la derecha y continuamos escribiendoworld
Casos de prueba:
["another", "test", "string"] or "another test string" ->
another
t
e
s
tstring
["programming", "puzzles", "and", "code", "golf"] or "programming puzzles and code golf" ->
programming
p
u
z
z
l
e
sand
c
o
d
egolf
["a", "single", "a"] or "a single a" ->
a
s
i
n
g
l
ea
Criterios de victoria
El código más corto en bytes en cada idioma gana. ¡No te dejes desanimar por los idiomas de golf!
Respuestas:
Carbón de leña , 9 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación: funciona dibujando el texto hacia atrás, transponiendo el lienzo después de cada palabra. 10 bytes para la entrada de cadena:
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación: Dibuja el texto hacia atrás, transponiendo el lienzo para espacios.
fuente
C (gcc) ,
947874 bytes-4 de Johan du Toit
Pruébalo en línea!
Imprime la escalera, un carácter (de la entrada) a la vez. Toma una cadena de palabras separadas por espacios.
fuente
*s==32
en*s<33
para guardar un byte.05AB1E ,
1916 bytes-3 bytes gracias a @Emigna .
Pruébalo en línea.
Explicación general:
Al igual que @Emigna respuesta 05AB1E 's (asegúrese de que le upvote por cierto !!), utilizo la orden interna lienzo
Λ
.Sin embargo, las opciones que uso son diferentes (por eso mi respuesta es más larga ...):
b
(las cadenas para imprimir): dejo la primera cadena en la lista sin cambios y agrego el carácter final a cada cadena siguiente en la lista. Por ejemplo["abc","def","ghi","jklmno"]
se convertiría["abc","cdef","fghi","ijklmno"]
.a
(los tamaños de las líneas): esto sería igual a estas cadenas, así que[3,4,4,7]
con el ejemplo anterior.c
(la dirección para imprimir):[2,4]
que se asignaría a[→,↓,→,↓,→,↓,...]
Entonces, el ejemplo anterior haría paso a paso lo siguiente:
abc
en dirección2
/→
.cdef
en dirección4
/↓
(donde el primer carácter se superpone con el último carácter, por lo que tuvimos que modificar la lista así)fghi
en dirección2
/→
nuevamente (también con superposición de caracteres finales / iniciales)ijklmno
en dirección4
/↓
nuevamente (también con superposición)Explicación del código:
fuente
€θ¨õšsøJ
.€θ¨õšsøJ
sonõIvy«¤})
,õUεXì¤U}
yε¯Jθ줈}
(los dos últimos requieren--no-lazy
). Desafortunadamente, todos tienen la misma longitud. Esto sería mucho más fácil si una de las variables por defecto fuera""
...""
... " ¿Está buscandoõ
o quiere decir siX
/Y
/®
hubiera sido""
? Por cierto, agradable 13 byter en el comentario de la respuesta de Emigna. Muy diferente a la mía y su tbh, con las instrucciones[→,↙,↓,↗]
que ha utilizado.õ
No es una variable. Sí, me refiero a una variable por defecto""
. Literalmente lo hagoõU
al comienzo de uno de los fragmentos, por lo que si X (o cualquier otra variable) se predetermina""
, ahorrará trivialmente dos bytes. ¡Gracias! Sí, ↙↗ es un poco nuevo, pero tuve la idea de intercalar las escrituras verdaderas con escrituras ficticias de longitud 2 de la respuesta de Emigna.05AB1E ,
1413 bytesGuardado 1 byte gracias a Grimy
Pruébalo en línea!
Explicación
fuente
€Y¦
podría ser2.ý
(no es que guardaría ningún byte aquí). Y esta es la primera vez que veo que el nuevo comportamiento€
en comparación con el mapa regular es útil..ý
antes pero nunca lo he usado, así que no pensé en ello.€
es el mapa regular para mí y lo he usado a menudo, el otro es el "nuevo" mapa;)Lienzo ,
17121110 bytesPruébalo aquí!
Explicación:
fuente
JavaScript (ES8),
91 7977 bytesToma entrada como un conjunto de palabras.
Pruébalo en línea!
Comentado
fuente
p
para realizar un seguimiento de los finales de línea es muy inteligente +1Python 2 , 82 bytes
Pruébalo en línea!
fuente
brainfuck , 57 bytes
Pruébalo en línea!
Toma la entrada como cadenas separadas NUL. Tenga en cuenta que esto está utilizando EOF como 0 y dejará de funcionar cuando la escalera exceda los 256 espacios.
Explicación:
fuente
.
en la línea 3 (de la versión comentada)? Estaba tratando de jugar con la entrada en TIO. En Mac, cambié el teclado a la entrada de texto Unicode e intenté crear nuevos límites de palabras escribiendo,option+0000
pero no funcionó. ¿Alguna idea de por qué no?-
lugar de.
la explicación. Para agregar bytes NUL en TIO, recomiendo usar la consola y ejecutar un comando como$('#input').value = $('#input').value.replace(/\s/g,"\0");
. No sé por qué tu camino no funcionóJavaScript, 62 bytes
Pruébalo en línea!
Gracias Rick Hitchcock , 2 bytes guardados.
JavaScript, 65 bytes
Pruébalo en línea!
fuente
t
cona
, luego eliminandot=
Aheui (esotope) ,
490458455 bytesPruébalo en línea!
Ligeramente golfizado mediante el uso de caracteres de ancho completo (2 bytes) en lugar de coreano (3 bytes).
Explicación
Aheui es como esolang de befunge. Aquí hay un código con color: 1 parte verifica si el carácter actual es espacio o no.
2 partes verifican si las palabras se escribieron de derecha a izquierda o de arriba a abajo.
? 3 parte es la condición de ruptura del bucle que escribe espacios.
? 4 partes verifican si el carácter actual es el final de la línea (-1).
La parte roja es la inicialización de la pila. Aheui usa pilas (desde
Nothing
hastaㅎ
: 28 pilas) para almacenar el valor.La parte naranja toma input (
뱋
) y verifica si es espacio, restando con32
(código ASCII del espacio).La parte verde agrega 1 a la pila que almacena el valor de la longitud del espacio, si se escribe de derecha a izquierda.
La parte morada es un bucle para imprimir espacios, si se escribe de arriba abajo.
La parte gris verifica si el carácter actual es
-1
, agregando uno al carácter actual.La parte azul imprime el carácter actual y se prepara para el próximo carácter.
fuente
Japt
-P
, 15 bytesIntentalo
fuente
bash, 119 caracteres
Esto usa secuencias de control ANSI para mover el cursor; aquí solo estoy usando guardar
\e7
y restaurar\e8
; pero la restauración tiene que tener el prefijo\n
para desplazar la salida si ya está en la parte inferior del terminal. Por alguna razón, no funciona si aún no está en la parte inferior de la terminal. * encogerse de hombros *El carácter actual
$c
está aislado como una subcadena de un solo carácter de la cadena de entrada.$w
, utilizando elfor
índice de bucle$i
como el índice en la cadena.El único truco real que estoy usando aquí es el
[ -z $c ]
que volverátrue
, es decir, la cadena está en blanco, cuando$c
es un espacio, porque no está entre comillas. En el uso correcto de bash, debe citar la cadena que se está probando-z
para evitar exactamente esta situación. Esto nos permite voltear el indicador de dirección$d
entre1
y0
, que luego se utiliza como índice en la matriz de secuencia de control ANSI,X
en el siguiente valor no espacial de$c
.Me interesaría ver algo que use
printf "%${x}s" $c
.Oh dios, agreguemos un poco de espacio en blanco. No puedo ver donde estoy ...
fuente
Perl 6 , 65 bytes
Pruébalo en línea!
Bloque de código anónimo que toma una lista de palabras e imprime directamente a STDOUT.
Explicación
fuente
Carbón de leña , 19 bytes
Entrada como una lista de cadenas
Pruébelo en línea (detallado) o pruébelo en línea (puro)
Explicación:
Lazo en el rango
[0, input-length)
:Si el índice es impar:
Imprima la cadena en el índice
i
en una dirección hacia abajo:Y luego mueva el cursor una vez hacia la esquina superior derecha:
De lo contrario (el índice es par):
Imprima la cadena en el índice
i
en una dirección regular correcta:Y luego mueva el cursor una vez hacia la esquina inferior izquierda:
fuente
Python 2 ,
8988 bytesPruébalo en línea!
fuente
C # (compilador interactivo de Visual C #) , 122 bytes
Pruébalo en línea!
fuente
J ,
474543 bytesPruébalo en línea!
Encontré un enfoque divertido y diferente ...
Comencé a jugar con las almohadillas izquierdas y las cremalleras con gerundios cíclicos, etc., pero luego me di cuenta de que sería más fácil calcular la posición de cada letra (esto se reduce a una suma de escaneo de la matriz elegida correctamente) y aplicar enmendar
}
a un espacio en blanco lienzo en la entrada arrasada.La solución se maneja casi en su totalidad por enmendar
}
:; ( single verb that does all the work ) ]
tenedor general;
la parte izquierda elimina la entrada, es decir, pone todas las letras en una cadena contigua]
parte correcta es la entrada en sí(stuff)}
Utilizamos la forma gerundia de enmendar}
, que consta de tres partesv0`v1`v2
.v0
nos da los "nuevos valores", que es el raze (es decir, todos los caracteres de la entrada como una cadena), por lo que usamos[
.v2
nos da el valor inicial, que estamos transformando. simplemente queremos un lienzo en blanco de espacios de las dimensiones necesarias.([ ' '"0/ [)
nos da uno de tamaño(all chars)x(all chars)
.v1
selecciona en qué posiciones colocaremos nuestros caracteres de reemplazo. Este es el quid de la lógica ...0 0
en la esquina superior izquierda, notamos que cada nuevo personaje está 1 a la derecha de la posición anterior (es decir,prev + 0 1
) o uno hacia abajo (es decir,prev + 1 0
). De hecho, hacemos el primer "len de la palabra 1" veces, luego el último "len de la palabra 2" veces, y así sucesivamente, alternando. Entonces crearemos la secuencia correcta de estos movimientos, luego escanearemos y sumaremos nuestras posiciones, que luego encajonaremos porque así es como funciona Modificar. Lo que sigue es solo la mecánica de esta idea ...([: <@(+/)\ #&> # # $ 1 - e.@0 1)
#:@1 2
crea la matriz constante0 1;1 0
.# $
luego lo extiende para que tenga tantas filas como la entrada. por ejemplo, si la entrada contiene 3 palabras, producirá0 1;1 0;0 1
.#&> #
la parte izquierda de eso es una matriz de las longitudes de las palabras de entrada y#
es copia, por lo que copia0 1
"len of word 1" veces, luego1 0
"len de palabra 2 veces", etc.[: <@(+/)\
hace la suma de escaneo y el cuadro.fuente
T-SQL, 185 bytes
Pruébalo en línea
fuente
Retina , 51 bytes
Pruébalo en línea!
Un enfoque bastante sencillo que marca cualquier otra palabra y luego aplica la transformación directamente.
Explicación
Marcamos cualquier otra palabra con un punto y coma haciendo coincidir cada palabra, pero solo aplicando el reemplazo a las coincidencias (que están indexadas a cero) a partir de la coincidencia 1 y luego 3 y así sucesivamente.
+(m
establece algunas propiedades para las siguientes etapas. El signo más comienza un bucle "mientras este grupo de etapas cambia algo", y el corchete abierto indica que el signo más debe aplicarse a todas las etapas siguientes hasta que haya un corchete cerrado frente a una tecla de retroceso (que es todas las etapas en este caso). Elm
justo le dice a la expresión regular que trate^
como también a juego desde el comienzo de líneas en lugar de sólo el comienzo de la cadena.La expresión regular real es bastante sencilla. Simplemente igualamos la cantidad apropiada de cosas antes del primer punto y coma y luego usamos la
*
sintaxis de reemplazo de Retina para colocar el número correcto de espacios.Esta etapa se aplica después de la última para eliminar puntos y comas y espacios al final de las palabras que cambiamos a vertical.
fuente
Retina 0.8.2 , 58 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Solución alternativa, también 58 bytes:
Pruébalo en línea! El enlace incluye casos de prueba.
No estoy usando deliberadamente Retina 1 aquí, así que no obtengo operaciones con palabras alternativas de forma gratuita; en cambio tengo dos enfoques. El primer enfoque se divide en todas las letras en palabras alternativas contando los espacios anteriores, mientras que el segundo enfoque reemplaza los espacios alternativos con líneas nuevas y luego usa los espacios restantes para ayudarlo a dividir palabras alternativas en letras. Cada enfoque debe unir la última letra vertical con la siguiente palabra horizontal, aunque el código es diferente porque dividen las palabras de diferentes maneras. La etapa final de ambos enfoques luego rellena cada línea hasta que su primer carácter no espacial se alinee debajo del último carácter de la línea anterior.
Tenga en cuenta que no asumo que las palabras son solo letras porque no tengo que hacerlo.
fuente
PowerShell ,
101 8983 bytes-12 bytes gracias a mazzy .
Pruébalo en línea!
fuente
& $b @p
(cada palabra como un argumento), 3) usar una forma más corta para lanew line
constante. ver línea 3,4 en este ejemplofoo
. Ver el código .Given a list of at least two words...
PowerShell ,
7465 bytesPruébalo en línea!
fuente
R , 126 bytes
Pruébalo en línea!
fuente
T-SQL, 289 bytes
Esto se ejecuta en SQL Server 2016 y otras versiones.
@ contiene la lista delimitada por espacios. @I rastrea la posición del índice en la cadena. @S rastrea el número total de espacios para sangrar desde la izquierda. @B rastrea con qué eje se alinea la cadena en el punto @I.
El recuento de bytes incluye la lista mínima de ejemplos. El script recorre la lista, carácter por carácter, y cambia la cadena para que se muestre de acuerdo con los requisitos. Cuando se alcanza el final de la cadena, la cadena se imprime.
fuente
JavaScript (Node.js) , 75 bytes
Pruébalo en línea!
Explicación y sin golf
fuente
Stax , 12 bytes
Ejecutar y depurarlo
fuente
Jalea , 21 bytes
Pruébalo en línea!
Un programa completo que toma la entrada como una lista de cadenas y que sale implícitamente a la palabra escalera
fuente
C (gcc) ,
9387 bytesGracias a gastropner por las sugerencias.
Esta versión toma una matriz de cadenas terminadas por un puntero NULL.
Pruébalo en línea!
fuente
Brain-Flak , 152 bytes
Pruébalo en línea!
Sospecho que esto puede ser más corto combinando los dos bucles para palabras pares e impares.
fuente
J,
3533 bytesEste es un verbo que toma la entrada como una sola cadena con las palabras separadas por espacios. Por ejemplo, podría llamarlo así:
La salida es una matriz de letras y espacios, que el intérprete genera con nuevas líneas según sea necesario. Cada línea se rellenará con espacios para que tengan exactamente la misma longitud.
Hay un pequeño problema con el código: no funcionará si la entrada tiene más de 98 palabras. Si desea permitir una entrada más larga, reemplace la
_98
en el código_998
para permitir hasta 998 palabras, etc.Permítanme explicar cómo funciona esto a través de algunos ejemplos.
Supongamos que tenemos una matriz de letras y espacios que imaginamos que es una salida parcial para algunas palabras, comenzando con una palabra horizontal.
¿Cómo podríamos anteponer una nueva palabra antes de esto, verticalmente? No es difícil: simplemente convierta la nueva palabra en una matriz de letras de una sola columna con el verbo
,.
, luego agregue la salida a esa matriz de una sola columna. (El verbo,.
es conveniente porque se comporta como una función de identidad si lo aplica a una matriz, que usamos para jugar al golf).Ahora no podemos simplemente repetir esta forma de anteponer una palabra como está, porque entonces solo obtendríamos palabras verticales. Pero si transponemos la matriz de salida entre cada paso, entonces cualquier otra palabra será horizontal.
Entonces, nuestro primer intento de solución es colocar cada palabra en una matriz de una sola columna, luego doblarlas agregando y transponiendo entre ellas.
Pero hay un gran problema con esto. Esto pone la primera letra de la siguiente palabra antes de girar un ángulo recto, pero la especificación requiere girar antes de poner la primera letra, por lo que la salida debería ser algo como esto:
La forma en que logramos esto es revertir toda la cadena de entrada, como en
luego use el procedimiento anterior para construir el zig-zag pero girando solo después de la primera letra de cada palabra:
Luego voltee la salida:
Pero ahora tenemos otro problema más. Si la entrada tiene un número impar de palabras, entonces la salida tendrá la primera palabra vertical, mientras que la especificación dice que la primera palabra debe ser horizontal. Para solucionar esto, mi solución agrega la lista de palabras a exactamente 98 palabras, agregando palabras vacías, ya que eso no cambia la salida.
fuente