Dada una cadena de letras y un conjunto de palabras, genera un orden de las palabras para que se puedan encontrar en la cadena colocando letras que no son necesarias. Las palabras pueden aparecer más de una vez en el conjunto de palabras. La cadena de entrada y todas las palabras constarán de 1 a 1000 letras minúsculas cada una. Las letras que se dejarán caer pueden aparecer dentro de palabras o entre palabras.
Su programa o función puede aceptar la cadena de letras y las palabras como listas, una cadena o desde STDIN, y debe mostrar todas las palabras en un orden correcto como una lista o salida de cadena. Si hay más de una solución correcta, solo envíe una de ellas. Si no hay una solución correcta posible, envíe una lista vacía o una cadena vacía.
Ejemplos:
dogcatfrog cat frog dog
-> dog cat frog
xxcatfixsxhingonxgrapexxxfishingcxat cat grape catfish fishing
-> catfish grape fishing cat
dababbabadbaccbcbaaacdacdbdd aa bb cc dd ba ba ba ab ac da db dc
-> da ab ba ba ba cc bb aa ac dc db dd
flea antelope
->
(no solution)
Este es el código de golf. El menor número de bytes gana.
Editar: explicó que los caracteres adicionales pueden estar dentro de las palabras.
cc
antesbb
pero las subcadenasbb
ycc
aparecen solo una vez y labb
subcadena aparece primeroccbcb
parte de la cadena sacamos lacc
salidabb
luego de soltar el medioc
.Respuestas:
Pyth,
2024 bytesMi primer intento en Pyth :)
Cómo funciona:
Notas: lleva mucho tiempo en el tercer ejemplo (
dababbabadbaccbcbaaacdacdbdd aa bb cc dd ba ba ba ab ac da db dc
).fuente
Pyth, 10 bytes
Demostración
Este programa tiene mucha fuerza bruta. Primero construye cada subconjunto de la entrada, luego cada partición de los subconjuntos, luego verifica el primero que es un reordenamiento de la lista de palabras. No se maneja ninguna posibilidad a través de errores sin salida a stdout, lo que está permitido por meta consenso. El error se puede eliminar por 2 bytes adicionales.
Tenga en cuenta que para muchos de los casos de prueba dados, el programa no se completará en un período de tiempo razonable.
fuente
JavaScript (ES6), 119 bytes
Acepta una cadena y un conjunto de palabras y devuelve un conjunto de palabras o
undefined
en caso de error. Agregue 2 bytes si debe devolver la cadena vacía en caso de falla (?q:``
), en cuyo caso esta versión alternativa solo tiene 120 bytes y devuelve la cadena vacía en caso de falla, e incluso puede guardar 2 bytes si se le permite devolver 0 en caso de falla:(Después de escribir esto, noté que el algoritmo es básicamente el mismo que la respuesta Pyth de @ KennyLau).
Edición editada: actualizada después de la aclaración de la pregunta, pero ahora es realmente lenta en el tercer caso de prueba; Lo puse en marcha la noche anterior y esta mañana me di cuenta de que realmente había encontrado la solución, entre 30 y 40 horas más tarde. Sin embargo, fui muy malo y le di la solución (funciona mejor con la solución inversa, que verificará al instante).
fuente
Java 7, 256 bytes
Definitivamente debería ser posible jugar más golf usando un enfoque diferente, pero esto lo hará por ahora.
Ungolfed y código de prueba:
Pruébalo aquí.
Salida:
fuente
Groovy (44 bytes)
No puedo creer que nadie más haya usado expresiones regulares para esto ...
Explicación
/${b.join('|')}/
- Crear una expresión regular para encontrar cualquiera de las palabras en una cadena..findAll(...)
- Encuentra y recoge todas las ocurrencias en la cadena en una matriz..join(" ")
- Unir la matriz junto con espacios.Básicamente, si no hay ocurrencias, la matriz está vacía y devuelve una cadena vacía implícitamente. Si encuentra ocurrencias, devuelve un objeto de matriz con las ocurrencias y luego lo aplana en una cadena.
fuente