Como programador, probablemente hayas oído hablar de barras inclinadas hacia adelante y hacia atrás. ¿Pero has oído hablar de las reducciones? Ahí es cuando tomas un montón de barras, conectas sus extremos y los dibujas bajando.
Para el desafío de hoy, debe escribir un programa o función que tome una cadena que consiste únicamente en barras, y genera todas esas barras dibujadas hacia abajo en una línea que las conecta. Esto será mucho más claro si ve un ejemplo. Dada la cadena \\\//\/\\
, debe generar:
\
\
\
/
/
\
/
\
\
Aquí hay algunas aclaraciones:
Debe haber una barra oblicua por línea.
La primera línea tendrá 0 espacios iniciales.
Para cada par de barras:
Si son diferentes entre sí, se dibujarán en la misma columna. Por ejemplo,
\/
dará:\ /
Si son del mismo carácter, el inferior está en la dirección apuntada , que se mueve hacia la derecha para una barra diagonal inversa y hacia la izquierda para una barra diagonal hacia adelante. Entonces
\\//
dará\ \ / /
Cada línea puede tener espacios en blanco finales adicionales siempre que esto no cambie la apariencia visual de la salida. Hasta una nueva línea final y líder también es aceptable. ¡ No se permiten espacios iniciales adicionales !
Para mantener esto más simple, puede suponer que la cadena nunca contendrá demasiadas barras diagonales. En otras palabras, ningún prefijo de la entrada contendrá más barras inclinadas que barras invertidas, por lo que una entrada como \\////
o //
nunca se dará. Esto también significa que cada entrada comenzará con una barra invertida.
Si su entrada se toma como un literal de cadena, puede escapar de las barras diagonales inversas si es necesario. Tampoco necesitará manejar una entrada que esté vacía o que contenga caracteres distintos de una barra diagonal.
Puede enviar por cualquier formato razonable .
Como de costumbre, este es un desafío de código de golf , así que trate de hacer la solución más corta posible, incluso si elige un idioma donde esto es bastante difícil. ¡Puntos de bonificación por explicar cualquier técnica interesante que utilizó para quitar bytes!
Ejemplos
#Input
\\\\\\\\\\\
#Output
\
\
\
\
\
\
\
\
\
\
\
#Input
\\\//\\/\//\\///
#Output
\
\
\
/
/
\
\
/
\
/
/
\
\
/
/
/
#Input
\/\/\/
#Output
\
/
\
/
\
/
Respuestas:
GNU Sed, 20
Tenga en cuenta que
^L
y^H
son caracteres literales de retroalimentación y retroceso (0x12 y 0x8).Esta respuesta funciona moviendo el cursor usando los caracteres de retroceso y avance de página. Las barras diagonales / barras diagonales inversas no se rellenan con espacios a la izquierda. No estoy seguro de que esto descalifique esta respuesta. Esto no funciona en TIO, pero se ve bien en terminales comunes como
xterm
ygnome-terminal
.Recree este script sed de la siguiente manera:
Ejecútelo de la siguiente manera:
Explicación:
fuente
Carbón ,
131211 bytesPruébalo en línea! El enlace es a la versión detallada del código. Soporta
//
s adicionales . Explicación:fuente
↓¶
= "Mover a la izquierda" en la descripción no está bien.\n/
hacia abajo"print \n/ down
porque sentí que era más útil describir el efecto del código en lugar de su traducción literal.MyCode - Do the spec
). Ahora lo entiendo, aunque el efecto es moverse hacia la izquierda; podría valer la pena decir "Mover a la izquierda (imprimiendo una nueva línea con una dirección de impresión hacia abajo)".Python 2 ,
5554515753 bytes-3 bytes (y una corrección de errores) gracias a Felipe Nardi Batista
Pruébalo en línea!
fuente
/// , 119 bytes
/// no tiene comandos de entrada, por lo que la entrada debe estar incrustada en el programa. Para este, la cadena de entrada simplemente se agrega, sin necesidad de escapar.
-d
opción (el estado del programa se muestra entre paréntesis antes de ejecutar cada comando).Cómo funciona
\\/\//
se agregará una entrada de al programa para demostración.
se usa para representar nuevas líneas en el código en línea.Abreviaturas
El comienzo
/=/\/\///M/|%%=N/%|||=C/BA=
del programa contiene sustituciones para abreviaturas de golf.=
se expande a//
,M
a|%%
,N
a%|||
yC
aBA
.Después de esto, el programa actual se convierte en
Entrada de recodificación
La siguiente etapa transforma la cadena de entrada agregada en una forma más utilizable. Dado que consta completamente de los dos caracteres de comando de ///, esto tiene mucho cuidado para evitar destrozar el programa base.
/\/\\/\/BA\\/
, reemplaza la cadena/\
con/BA\
./\
en este momento, por lo que esta sustitución no lo afecta.\
s seguidas de secuencias de/
s, que junto conABA
el final del programa base permite iterar a través de él con las siguientes sustituciones.ABA
prefijo antes, la cadena de entrada de ejemplo ahora se convierte enABA\\/BA\//
./BA\\/BAbBA/
, reemplazaBA\
porBAbBA
.\
s de la cadena de entrada, que ahora con prefijo se convierteABAbBAbBA/BAbBA//
/B\A\//BAfBA/
cambiaBA/
aBAfBA
, iterando a través del/
s.\
en esta sustitución es necesario ya que de lo contrario sería destrozado por el anterior.ABAbBAbBAfBABAbBAfBAfBA
./AB//
elimina algunas partes superfluas de la codificación, convirtiéndola enAbBAbBAfBAbBAfBAfBA
.AB
de la/|/AB\\/
sustitución adelante en el programa, lo que se necesitaba para protegerlo de lo anterior/\
manipulación.\
las cadenas de entrada originales se han convertidoAbB
, y todas se/
han convertidoAfB
. (b
yf
espera hacia atrás y hacia adelante). Hay un callejónA
al final.A
sysB
con fragmentos de programa para ejecutar en la etapa final. En las cadenas de reemplazo,%
s y|
s codificar lo que se convertirá en/
s y\
s respectivamente. Esto tiene dos beneficios:/
y\
, los%
sys|
no necesitan escapar para ser copiados./\
, que de lo contrario habría sido destrozada por las manipulaciones anteriores./|/\\/
(anteriormente/|/AB\\/
) ahora decodifica la|
s, después de lo cual se/%/|//
ha convertido en lo siguiente/%/\//
y decodifica la%
s.Estructura del programa en la etapa final.
En este punto, el programa base ha ejecutado todas sus sustituciones, y todo lo que queda es la codificación del programa de la cadena de entrada.
Cada carácter de entrada se ha convertido en un subprograma.
(nueva línea final), donde
*
representaf
para un original/
ob
para un original\
./\//xy
al final del programa, que no tendrá ningún efecto, excepto para proporcionar una necesaria/
para las sustituciones del subprograma anterior.Subcadena compartida
Antes de que comience la iteración final a través de los subprogramas, hay una subcadena que cruza el límite después del subprograma de cada carácter del formulario
\//
./
se ejecutará su copia de esta subcadena compartida (excepto la final , que ancla las sustituciones) para imprimir la línea para ese personaje./
, que es la "línea anterior" imaginaria correcta para que se imprima el primer carácter de entrada al comienzo de su línea.\\
o\/
, una nueva línea y un siguiente/
.Ejecutar un subprograma de caracteres
Varias de las siguientes sustituciones contienen
\
s adicionales en el interior para evitar que sean emparejados y mutilados entre sí (incluidas otras copias en otros subprogramas). El logro de esta es también la razón por la cual los dosx
yy
son necesarios./\//xyf\z/
o/\//xyb\z/
, hace que/
al final de la subcadena compartida se convierta enxyfz
oxybz
, inmediatamente después de\/
o\\
./\\\\x\y/ /
reemplaza\\xy
por un espacio, y la sustitución/\\\/x\y//
reemplaza\/xy
por nada.\
o/
, respectivamente.\
siguiente, seguido defz
obz
./ \fz/\\\/\//
reemplaza fz
por\//
, y/b\z/\\\\\//
reemplazabz
por\\/
./
o\
, respectivamente./
correctamente.///
, que es un bucle infinito./
al final de la subcadena compartida.Después de que se haya ejecutado el último subprograma de caracteres, lo que queda del programa es
/\//xy
. Como se trata de una sustitución incompleta con un final faltante/
, el programa lo omite y se detiene normalmente.fuente
Jalea , 14 bytes
Un programa completo que imprime el resultado.
Pruébalo en línea!
¿Cómo?
fuente
Haskell , 49 bytes
Pruébalo en línea!
fuente
Perl 5 , 44 bytes
42 bytes de código + 2 para
-F
banderaPruébalo en línea!
fuente
JavaScript (ES8),
665963 bytes7 bytes guardados gracias a Justin Mariner
+4 bytes para arreglar
/\\/\\/
(notado por Neil )Pruébalo en línea!
fuente
MATL ,
231918 bytes1 byte de descuento gracias a @Sanchises
La entrada es una cadena entre comillas simples.
Pruébalo en línea! O verificar los casos de prueba: 1 , 2 , 3 .
Explicación
Considere la entrada
'\\\//\/\\'
como un ejemplo.fuente
C # (.NET Core) ,
748882787776 + 18 bytes-1 byte gracias a Kevin Cruijssen
Emite una colección de cadenas, una para cada línea. El recuento de bytes también incluye:
Pruébalo en línea!
Explicación de la respuesta de 77 bytes:
fuente
/\\/\\/
.s.Take(i).Sum(y=>y<92?-1:1)+(x-s[0])/45+1
a(x-s[0])/45-~s.Take(i).Sum(y=>y<92?-1:1)
05AB1E , 14 bytes
Pruébalo en línea!
Explicación
fuente
/\\/\\/
.Ç¥.¥0<.SηOv¹Nèy<ú,
sollozando en binarioR ,
122121 bytes-1 byte gracias a Giuseppe
Pruébalo en línea!
Con espacios en blanco adicionales:
Explicación: Esta respuesta se basa en la observación de que el número de espacios iniciales cambia cada línea en -1, más el número de
/
líneas anteriores y actuales.Si tenemos N barras diagonales, la variable
y
es un vector de longitud N, con 1 para cada posición con\
, 0 de lo contrario. Por lo tanto, para obtener el cambio en el número de espacios iniciales por línea, calculamosy[1:(N-1)] + y[2:N] - 1
. La funcióndiffinv
convierte estas diferencias en una secuencia, comenzando con 0. El resto es solo una cuestión de ensamblar cada línea como el número requerido de espacios finales, seguido de la barra oblicua relevante y una nueva línea.fuente
diffinv
;) También puede configurary=x>")"
para -1 bytestrsplit
, lo que siempre es un asesino. ¡También puedes hacer uso de los famososdiffinv
!library(methods)
en el encabezado (que debería estar bien sin penalización ya que ese paquete es parte base R), puedes usarloel
. Además,diffinv
resultó ser tan largo comocumsum
! :)*S
arruina las cosas.Brain-Flak , 175 bytes (174 caracteres + 1 bandera)
Corre con
-c
bandera.Pruébalo en línea!
Explicación
fuente
Ruby ,
8076 bytes-4 bytes gracias a manatwork
Pruébalo en línea!
Explicación:
fuente
.each_cons(2){…}
. En cambio, puede guardar reemplazando.each_char
→.chars
.i+=
al comienzo de la expresión ternaria anidada y finalizándola con-1:1:0
.Java 8,
121118110109102 bytes-7 bytes gracias a la magia sabia de @Nevay . :)
Explicación:
Pruébalo aquí
fuente
a->{String r="";int s=0,p=0,i;for(char c:a){for(i=s+=p+(p=c-63)>>5;i-->0;r+=" ");r+=c+"\n";}return r;}
>>
/>>>
/<<
... Solo había verificado algunas cosas con&
/|
/~
/^
..>.>C (GCC),
13713497 bytesPruébalo en línea!
• 3 bytes gracias ATaco
• 37 bytes gracias a Digital Trauma y ThePirateBay
Nada demasiado elegante, solo una función recursiva simple que toma una cadena e imprime las barras diagonales, tenga en cuenta que la entrada debe escapar primero de las barras diagonales inversas.
Uso
Sin golf
Esto es para la respuesta anterior, ¡mira el enlace para probarlo en línea para obtener una actualizada!
Salida
fuente
c=='\0'
con!c
el mismo efecto.printf("%*s%c", n, "", c)
para imprimir el carácter con n espacios iniciales?(c!=n)
conc-n
y reordenando las expresiones ternarias. Lo mismo con(c=='/')
. Además, puede reemplazar'/'
con un número literal47
. Creo que son 7 bytes en total.C, 60 bytes
Pruébalo en línea!
fuente
Retina , 47 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Explicación:
Agregue un espacio al comienzo de cada línea y antes de cada una
\
.Considere los dos primeros caracteres de la cadena. Si el primero es un,
/
entonces la sangría necesita ser decrementada; esto se logra al incluir el espacio anterior en la captura (que siempre existe porque la primera etapa lo agregó); si el segundo es a,\\
entonces necesita ser incrementado; esto se logra al incluir el espacio que la primera etapa agregó en la captura. Habiendo dado al segundo carácter la sangría correcta, la etapa se repite para el segundo y tercer carácter, etc.Eliminar la sangría adicional.
He escrito una versión de 94 bytes que (como mi respuesta de carbón) permite cualquier combinación de barras: ¡ Pruébelo en línea! Explicación:
Haga rodar la pelota tomando el último corte y sangrando en la misma posición en su propia línea.
Prefije espacios en todas las barras inclinadas para que puedan capturarse.
Repetidamente tome la última barra diagonal de la entrada y alinéela en su propia línea con la barra diagonal en la línea de abajo.
Elimine cualquier sangría restante.
Eliminar la entrada ahora vacía.
fuente
Lua , 96 bytes
Pruébalo en línea!
La más corta que se me ocurrió en Lua. La entrada se toma de la línea de comando.
Esto usa algunos trucos:
(...):gmatch(
Esta debería ser la forma más corta de obtener una sola cadena en un programa Lua desde la línea de comandos. La
...
expresión en Lua captura cualquier exceso de parámetros en una función que no se especifica en la declaración de la función y se usa para varargs. Como el cuerpo principal de un programa Lua se llama como una función con los argumentos de la línea de comando como sus parámetros, los argumentos de la línea de comando terminarán en...
.Los paréntesis a su alrededor convierten la
...
expresión potencialmente multivalorizada en una expresión de valor único. Considere este ejemplo (algo sorprendente):and
/or
para la lógica "if x then value1 else value2".El
and
operador de Lua devuelve su primer argumento si es falso; de lo contrario, devuelve su segundo argumento. Elor
operador devuelve su primer argumento si es verdadero; de lo contrario, el segundo argumento.p
No necesita ninguna inicialización.p==s
siempre tiene que ser falso en la primera ejecución del bucle, independientemente de la entrada. Si no establecep
ningún valor antes de ingresar al ciclo (dejarlonil
), eso sucederá y también se guardarán bytes.¿Alguien puede jugar al golf esto (en Lua)?
fuente
c=0(...):gsub(".",function(s)c=c+(p==s and(s=="/"and-1or 1)or 0)p=s print((" "):rep(c)..s)end)
gmatch(".")
agmatch"."
como lo hizo en su próxima respuesta.Pyth , 28 bytes
Pruébalo en línea!
fuente
Q
en su lugar:j.u+?qeNY?>Y\/+PNdPPNPNYtQh
.R , 119 bytes
Pruébalo en línea!
Esto difiere un poco de la respuesta del usuario 2390246 . Cada uno itera sobre la cadena, imprimiendo un cierto número de caracteres de espacio y luego el
/\
carácter apropiado .Sin embargo, evité dividir la cadena, optando por reemplazar los caracteres con su valor de codificación UTF-8, lo que me permite hacer aritmética en los números directamente, lo que me ahorró solo unos pocos bytes.
fuente
diffinv
definitivamente no funcionará aquí.C # (.NET Core) , 60/65 bytes
Intenté una versión más corta de C #
como se dijo: "Esto también significa que cada entrada comenzará con una barra diagonal inversa". O un poco más de tiempo que resuelven el inicio "/"
Pruébalo en línea!
fuente
Lua ,
8884 bytesVersión mejorada (-4 bytes gracias a QuertyKeyboard)
Pruébalo en línea!
Versión original (88 bytes)
Otro intento en Lua, esta vez con un enfoque completamente diferente utilizando la manipulación de cadenas en lugar de una variable de contador.
Sin golf:
Hay una cosa interesante en el código:
(...):gmatch"."
utiliza algunas peculiaridades en el analizador Lua. Cuando Lua encuentra un fragmento de código en el formulario
func "string"
, lo convertirá afunc("string")
. Esto es para que uno pueda escribirprint "string"
para imprimir una cadena constante y solo funciona con un solo literal de cadena después de la función. Cualquier otra cosa dará un error de sintaxis. Sin embargo, este azúcar sintáctico también funciona con llamadas de función en el medio de una expresión y, lo que es más sorprendente, funciona bien junto con el:
método llamado azúcar sintáctico. Entonces, al final, Lua interpretará el código así:Si alguien puede pensar en una forma de eliminar una de las tres llamadas gsub, dígame.fuente
s=""g=s.gsub g(...,".",function(c)s=g(g(g(s,"\\"," "),"/?$",c)," /","/")print(s)end)
Pyth - 33 bytes
Primer intento, jugará al golf.
Pruébelo en línea aquí .
fuente
Perl, 40 + 2 bytes
Necesitas la
-F
bandera.fuente
Perl,
3438 + 1 bytespara manejar los dos casos
para ejecutarse con
-p
opciónEDITAR: el siguiente comentario no funciona cuando el primer personaje es
/
sin embargo, la salida se desplazará un carácter a la derecha si el primer carácter es
\
fuente
/\\/\\/
.34
solución original ahora es perfectamente válidaVBA (Excel), 181 bytes
fuente
[...]
notación: lo reduje a 128 BytesSub q
For x=1To[Len(A1)]
c=Mid([A1],x,1)
If c="\"Then Debug.?b;c:b=b+" "
If c="/"Then b=Left(b,Len(b)-1):Debug.?b;c
Next
End Sub
Pyth ,
2421 bytesPort de la respuesta de Rod .
Pruébalo en línea!
fuente
\
. Por cierto, ¿dónde está tu código?SOGL V0.12 ,
1613 bytesPruébalo aquí! - espera entrada en la pila, por lo que
,
se agrega facilidad de usofuente
Dyalog APL, 31 bytes
Pruébalo aquí!
fuente
{↑⍵↑¨⍨a-1-+\¯1*a←⍵='\'}