Aquí le mostramos cómo retroceder y volver a escribir de una cadena a otra:
- Comience desde la primera cadena.
- Elimine los caracteres al final hasta que el resultado sea un prefijo de la segunda cadena. (Esto puede tomar 0 pasos).
- Agregue caracteres al final hasta que el resultado sea igual a la segunda cadena. (Esto también puede tomar 0 pasos).
Por ejemplo, la ruta de fooabc
a se fooxyz
ve así:
fooabc
fooab
fooa
foo
foox
fooxy
fooxyz
Tarea
Dada una lista de palabras, escriba un programa que retroceda y vuelva a escribir su camino desde la cadena vacía, a todas las palabras de la lista en sucesión, de vuelta a la cadena vacía. Salida de todas las cadenas intermedias.
Por ejemplo, dada la lista de entrada ["abc", "abd", "aefg", "h"]
, la salida debería ser:
a
ab
abc
ab
abd
ab
a
ae
aef
aefg
aef
ae
a
h
Reglas
Puede devolver o imprimir una lista de cadenas, o una sola cadena con algún delimitador de elección. Opcionalmente, puede incluir las cadenas vacías iniciales y finales. Se garantiza que la entrada contiene al menos una palabra, y cada palabra solo contiene letras minúsculas ASCII ( a
- z
). Editar: se garantiza que las cadenas consecutivas en la entrada no sean iguales entre sí.
Este es el código de golf ; el código más corto en bytes gana.
Una implementación de referencia en Python 3: ¡ Pruébelo en línea!
["abc","abc"]
?a,abc,abcde,abc,a,abc,abcde
Respuestas:
Pyth,
2523 bytesPruébalo en línea.
fuente
Perl, 43 bytes
42 bytes de código +
-n
banderas.Para ejecutarlo:
fuente
abc
hacer que se imprimiera 3 veces (pero en realidad, la primera y la tercera vez fue sin el espacio). Lo quité.Java 8, 144 bytes
Este es similar a la implementación de referencia pero combina los dos
while
bucles. Es una expresión lambda que acepta unString[]
parámetro.Sin golf
Expresiones de gratitud
fuente
class B
lugar deinterface B
? Puede ejecutar desde una clase de paquete privado. Además, considere usar un lambda como ya ha especificado Java8.interface B{static void main
es más corto queclass B{public static void main
.a->{/*your code*/}
, lo que asignará a una variable de tipojava.util.function.Consumer<String[]>
. Sin embargo, no puedo probar en este momento.Mathematica, 149 bytes
fuente
Retina , 39 bytes
El recuento de bytes asume la codificación ISO 8859-1.
Pruébalo en línea!
La entrada y la salida son listas separadas por salto de línea. La salida incluye la cadena vacía inicial y final.
fuente
Jalea ,
312926 bytesPruébalo en línea!
Cómo funciona
fuente
Haskell ,
102 93 9190 bytesLa última línea es una función anónima, que toma y devuelve una lista de cadenas. Pruébalo en línea!
Explicación
Mi solución es recursiva. Primero,
?
es una función infija de ayuda:a?b
da los primeroslength a
caracteres deb
, o la totalidad deb
ifa
es más larga. A continuación defino una función infija!
. La idea es quea!x
, dondea
hay una cadena yx
una lista de cadenas, produce la ruta desdea
la primera cadena hacia adentrox
y vuelve a la cola dex
. En la línea final defino una función anónima que agrega la cadena vacía, luego se aplica!
a la cadena vacía y a la entrada.Explicación de
!
:fuente
Python 2,
118107103979392 bytesLa entrada se da como
['abc', 'abcdef', 'abcfed']
, o como ["abc", "abcdef", "abcfed"]
.Revisión 1: -11 bytes. El crédito va a @xnor por su publicación sobre los consejos de golf de Python, y a @Lynn por encontrar el consejo para mí y para mí por ser inteligente. Se hicieron dos cambios: en lugar de
not s.startswith(i)
, usés.find(i)
, y en lugar dei!=s
usari>s
.Revisión 2: -4 bytes. El crédito me corresponde al darme cuenta de que cometí un error realmente tonto. En lugar de usar sangría de una sola pestaña y doble pestaña, usé sangría de un solo espacio y una sola pestaña.
Revisión 3: -6 bytes. El crédito va a @ mbomb007 por sugerir poner los ratos en una sola línea. También arreglé un error cambiando
s.find(i)
ai.find(s)
.Revisión 4: -4 bytes. El crédito va a @xnor por darse cuenta de que no necesitaba almacenar la entrada en una variable.
Revisión 5: -1 byte. El crédito me corresponde por darme cuenta de que
['']
es lo mismo que[s]
cuando lo agrego a la entrada.fuente
while
cada una en una sola línea. Además, puede usar en<1
lugar denot
.startswith
.while
s en una sola línea. ¿Quieres decir comowhile s.find(i):s=s[:-1];print s
? Además, gracias por la sugerencia sobre<1
, pero he cambiado a algo aún más corto gracias a uno de los consejos de xnor en el hilo de consejos de Python.GNU M4, 228 o 232 bytes¹
(¹ dependiendo de si terminar el archivo con
dnl\n
o no, todavía soy nuevo en golf y M4)Además, se pueden guardar 3 bytes reemplazando el segundo argumento de
substr
from0
por la cadena vacía, pero eso generaría muchas advertencias en stderr.Sin golf:
Uso:
fuente
PHP,
11611110183 bytesNota: utiliza la codificación de Windows-1252.
Corre así:
Explicación
Ajustes
trim($c^$w,"\0")
para verificar la coincidencia de subcadena en lugar de$c&&strpos($w,$c)!==0
.~ÿ
para producir una cadena con un byte NUL en lugar de"\0"
$c=$c.ÿ&$w
sufijo$c
con el siguiente carácter de$w
fuente
Lotes,
296291 bytesCalcular el prefijo común era engorroso.
fuente
PHP, 153 bytes
terriblemente largo :(
Corre con
php -nr '<ode>' <text1> <text2> ...
.fuente
JavaScript (ES6), 135 bytes
Interesante desafío! Uso:
g(["abc", "abd", "aefg", "h"])
. Parece que no puedo guardar ningún byte escribiendo esto como una función, por lo que son dos. Nuevas líneas no incluidas en el recuento de bytes.Estoy seguro de que esto se puede reducir mucho más. Agregará una versión no golfizada más tarde.
fuente
Javascript, 98 bytes
La respuesta Java del puerto de Jakob
fuente