Índice de subcadena más corto

9

Soy una persona perezosa pero eficiente, como muchos de ustedes probablemente también lo sean. Entonces, cada vez que estoy haciendo algo quiero hacerlo con un mínimo esfuerzo. Es por eso que te pido que resuelvas este problema por mí.

Lo que tengo aquí es un tipo de documento. En cada línea de este documento hay una sola palabra o frase corta. El documento no está ordenado, pero está bien, sé dónde está todo. Podría necesitar ayuda para encontrar las cosas más rápido, y para eso necesito una segunda lista. Aquí es donde entras. Para cada línea de texto en este documento, necesito algún identificador. Algo que puedo CTRL+ F, pero no puede ser más de lo absolutamente necesario para obtener ese resultado.

Entrada de ejemplo:

(blank)
an apple
spiderman 3
7pm pick up laundry
tequila
fake mustache
dishes on wednesday
banana
biscuits
(blank)

Salida de ejemplo:

ap,3,7,q,f,w,ba,bi

Voy a repetirme aquí, para asegurarme de que estamos en la misma página:

  • La entrada es un archivo de texto sin formato que contiene una lista de elementos, separados por saltos de línea. Lo tengo aquí en formato .txt, se llama "STUFF.TXT"
  • La primera y la última línea del documento están vacías. Cada otra línea contiene una entrada de longitud> 0.
  • El archivo contiene solo caracteres alfanuméricos (todo en minúsculas), espacios y saltos de línea.
  • La salida deseada es una lista de identificadores, en el mismo orden que mi lista original.
  • No quiero más de una palabra de búsqueda para cada elemento de la lista. Si hay varias respuestas, elija una, no me importa cuál. En el ejemplo anterior elegí 'ap' para an apple, pero podrías haber elegido 'n', 'a', 'pp', 'pl' o 'le'. No 'an', porque eso está adentro banana.
  • Les puedo asegurar que el archivo nunca está vacío y nunca contiene duplicados.
  • Si es necesario , puede coincidir en el terminador de línea. Pero ese es un último recurso solo para usarse cuando no hay otra manera de distinguir entre los elementos de la lista (por ejemplo, 'manzana' y 'manzanas').

Las lagunas estándar no están permitidas. Además, este es el código de golf por lo que gana el código más corto.

Un ejemplo más:

(blank)
ban
any
king
bean
yen
rake
raki
bar
(blank)

Y su salida:

ban,ny,g,be,ye,ke,aki,ar
Freekvd
fuente
1
@CarpetPython tiene que ser lo más corto posible. Los espacios pueden estar en entrada y salida, lo que se agrega a la pregunta.
Freekvd
¿Podemos usar también nuevas líneas al comienzo del término de búsqueda, si una cadena es sufijo de otra?
Martin Ender
@ MartinBüttner sí. Es por eso que el documento comienza y termina con una línea en blanco, para que tenga esas nuevas líneas al comienzo y al final de cada elemento de la lista.
Freekvd
44
Estoy bastante seguro de que este problema es NP-completo. Creo que puedo construir una reducción del problema de cobertura exacto a este.
FUZxxl
44
Es más que no verá ninguna solución creativa, ya que no hay mejor solución que la fuerza bruta.
FUZxxl

Respuestas:

3

Pyth, 39 bytes

Lsm.:bdtUbKfT.zj\,mhf!}Yjb-Kk+yky++bkbK

Bruteforces todos los subconjuntos de cada cadena en longitud creciente y comprueba si esa cadena ocurre dentro de cualquier otra. Si eso no funciona, hará lo mismo excepto para todos los subconjuntos de \nstring\n.

orlp
fuente
Recibo un error de combinación de tipo incorrecto cuando pruebo esto. pyth.herokuapp.com/…
freekvd
@freekvd Heroku debe tener una versión desactualizada de Pyth, porque llamar .:con el primer tipo de cadena y el segundo tipo de int no es un error. Intente usar Pyth desde el repositorio: github.com/isaacg1/pyth
orlp