Word Changer es un juego en el que intentas convertir una palabra en otra a través de ediciones de un solo carácter, y cada paso es su propia palabra. Para este desafío, las ediciones pueden ser reemplazos, inserciones o eliminaciones. Por ejemplo, WINNER → LOSER se puede hacer con esta ruta (puede haber otras):
WINNER
DINNER
DINER
DINE
LINE
LONE
LOSE
LOSER
Dicho de otra manera, debe poder alcanzar una palabra de la otra yendo solo a través de otras palabras a una distancia de Levenshtein de 1 cada vez.
Codificación
Se le proporcionará una lista de palabras y dos palabras y debe generar una ruta válida de una palabra a la otra si existe una ruta o un valor constante distinto o un comportamiento constante si no existe una ruta.
- Puede suponer que las palabras de entrada están ambas en la lista de palabras
- La lista de palabras se puede acceder a través de cualquier formato plano conveniente.
- Las listas, los conjuntos, los intentos, las cadenas separadas por espacios y los archivos separados por líneas son todos válidos (por ejemplo), pero un gráfico precalculado de adyacencia de Levenshtein no lo es.
- La ruta de salida debe incluir ambas palabras de entrada, pero lo que comienza y termina no importa.
- Si no se encuentra ninguna ruta, puede generar una constante específica, un valor falso, una lista vacía, lanzar una excepción, salir con un código distinto de cero o cualquier otro comportamiento que ocurra en un tiempo finito.
- La ruta no necesita ser óptima y no se requiere qué ruta se debe tomar
- La complejidad computacional no importa, sin embargo, se debe garantizar que su programa termine en un tiempo limitado. (incluso si fuera más allá de la muerte por calor del universo)
- Puede suponer que todas las palabras están completamente compuestas de letras en el mismo caso
Ejemplos de casos de prueba
- GATO → PERRO; [GATO, PERRO, COG, COT, RANA, GROG, BOG]
- CAT, COT, COG, PERRO
- BAÑO → DUCHA; [BAÑO, DUCHA, HATH, SOMBRERO, BAT, SAT, SAW, SOW, SHOW, CÓMO]
- No se encontró ruta
- BREAK → FIX; [BREAK, FIX, BEAK, BREAD, READ, BEAD, RED, BED, BAD, BID, FAD, FAX]
- BREAK, BREAD, BEAD, BAD, FAD, FAX, FIX
- CONSTRUIR → DESTRUIR; [CONSTRUIR, DESTRUIR, CONSTRUIR, CULPAR, GUILD, DORAR, GILL, BILL, DILL, FILL, DESTRUCT, ESTRUCTURA, CONSTRUCT]
- No se encontró ruta
- TARJETA → TABLERO; [TARJETA, TABLERO, BARDO]
- TARJETA, BARDO, TABLERO
- DEMONIO → ÁNGEL; [DEMONIO, ÁNGEL]
- No se encontró ruta
- ÚLTIMO → PASADO; [ÚLTIMO, PASADO, BLAST, CAST, BLACK, GHOST, POST, BOAST]
- ULTIMO, PASADO
- INSERTAR → ELIMINAR; Esta lista de palabras
- INSERTAR, INVERTIR, INVENTAR, INBENTAR, DESMONTAJE, DESMONTAJE, DESVINCULAR, DESVINCULAR, DESCUBRIR, INKING, IRKING, DIRKING, DARKING, DARLING, ARLING, AILING, SIRING, SERING, SERINE, NERINE, NERITE, CERITE, CERATE, DERATE, DELATE, ELIMINAR
code-golf
string
decision-problem
Carne de res
fuente
fuente
Respuestas:
05AB1E ,
232120 bytesImprime una lista de rutas válidas.
Guardado 2 bytes gracias a Kevin Cruijssen .
Pruébalo en línea!
fuente
Dævyœ«}
a怜€`
. (No estoy seguro de por qué ambos mapas por separado€
funcionan bien, peroæεœ`}
no por cierto, pero de todos modos es el mismo conteo de bytes.)[]
sea en1
lugar de0
(sin embargo, no es demasiado sorprendente) o que una verificación igual con una lista vacía aparentemente dé como resultado una lista vacía en lugar de0
(esta la veo como un error ...). De lo contrario, podría haber combinado el filtro y find_first para guardar otro byte:怜€`.Δü.LPy¬²Qsθ³QP
€
. Creo que la verificación igual da como resultado una lista vacía debido a la vectorización. Tal vez debería haber un caso especial para la lista vacía, pero tal vez eso sería inesperado en otros casos.JavaScript (V8) ,
177176 bytesToma entrada como
(target)(source, list)
. Imprime todas las rutas posibles. O no imprime nada si no hay solución.Pruébalo en línea!
Comentado
fuente
Wolfram Language (Mathematica) , 59 bytes
Pruébalo en línea!
fuente
Python 2 , 155 bytes
Pruébalo en línea!
Toma dos palabras y un conjunto de palabras como entrada; devuelve una ruta (no óptima) si existe una como una lista de cadenas; de lo contrario, devuelve False.
Este fragmento:
es
True
si y sólo sia==w
oa
tiene Levenshtein distancia de1
partirw
.fuente
Wolfram Language (Mathematica) , 124 bytes
Pruébalo en línea!
fuente
Python 2 , 163 bytes
Si se encuentra una ruta, se envía a stderr y el programa sale con el código de salida 1.
Si no hay ruta, no hay salida y el programa termina con el código de salida 0.
Pruébalo en línea!
fuente
Python 3 ,
217214212201 bytes-11 bytes gracias a una pista de xnor
Pruébalo en línea!
fuente
Jalea , 38 bytes
Pruébalo en línea!
Un programa completo que acepta tres argumentos. La primera es la palabra inicial y se suministra como
[["START"]]
. El segundo argumento es la palabra final, suministrada como"END"
. El tercer argumento es la lista de palabras, suministrada como palabras citadas, separadas por comas.El programa devuelve una lista de listas, y cada lista representa una ruta válida desde el principio hasta el final. Si no hay una ruta válida, la respuesta es una lista vacía.
En el enlace TIO, hay texto de pie de página para mostrar el resultado muy bien con cada palabra separada por espacios y cada lista de palabras separadas por nuevas líneas. Si se prefiere una representación de lista subyacente impresa, esto podría hacerse como
ÇŒṘ
.A diferencia de 05ABIE, no hay una distancia incorporada para Levenshtein, por lo que este programa compara outfixes con un solo carácter que falta, algo similar a la solución de @ ChasBrown , aunque con un toque de gelatina.
Explicación
Enlace auxiliar: enlace monádico que toma una lista de palabras y devuelve una lista de posibles listas extendidas, o una lista vacía si no es posible una extensión adicional
Enlace principal
fuente
Swift 4.2 / Xcode 10.2.1 , 387 bytes
Pruébalo en línea!
fuente