Dado un archivo de diccionario (un archivo de texto que contiene una palabra o frase en cada línea, con posible puntuación pero sin números; las líneas están ordenadas alfabéticamente), debe generar cada combinación de palabras donde una letra puede eliminarse de una palabra para formar otra; la letra eliminada debe estar entre paréntesis.
Por ejemplo, la entrada
cat
cart
code
golf
ode
verify
versify
debería dar una salida de
ca(r)t
(c)ode
ver(s)ify
Múltiples formas de obtener el mismo par solo deben mostrarse una vez. Puede generar scra(p)ped
o scrap(p)ed
, pero no ambos.
La salida debe ordenarse alfabéticamente por la entrada más larga;
mart
mar
mat
ma
debe tener una salida de
ma(r)
ma(t)
ma(r)t
mar(t)
y los dos últimos podrían estar en cualquier orden.
El archivo del diccionario puede incluir mayúsculas, espacios, guiones o apóstrofes; Estos deben ser ignorados. Por ejemplo,
inlay
in-play
debe producir in(p)lay
. Su salida debería estar en el mismo caso. Se permite espacio en blanco adicional.
La entrada puede ser STDIN o de un archivo; Está separado por nuevas líneas. La salida puede ser el valor de retorno de una función o STDOUT (o escrito en un archivo si lo desea).
Este es el código de golf , por lo que gana el código más corto en bytes.
(Este es mi primer desafío en PPCG; avíseme si he hecho algo mal y lo solucionaré).
mart mar mat ma
? ¿Lo seríamar(t) ma(r)t ma(r) ma(t)
?Respuestas:
Perl -an0, 101 + 3 bytes
dónde
@F
es el diccionario, almacenado en una matriz, proporcionado por runtime flag magic. (b-oost, BoO # @% @ # $% $ # @ T)map{s/\W//g;lc}@F
elimina todos los símbolos de las palabras y convierte todo en minúsculas. (impulso, arranque)sort{length$b<=>length$a}
Se clasifica en longitud. (arranque, impulso)map{ (...) while/(.)(?!\1)/g}@F
coincide con todos los caracteres que no son seguidos por el mismo carácter ([b] oot, bo [o] t, boo [t], ...)print"$`($1)$'\n"
imprime las partes que preceden, paréntesis y suceden una coincidencia ... (boo (s) t)if $`.$'~~@F
... si la concatenación de todo antes y después del partido está en el diccionario. ([aumentar])fuente
JavaScript (ES6), 225
Una función con un parámetro de cadena, sin entrada del archivo. Le pregunté a OP si esto podría ser válido.
Pruebe ejecutar el fragmento en un navegador compatible con EcmaScript 6 (implementando funciones de flecha, cadena de plantilla, operador de propagación: Firefox, tal vez Safari o MS Edge, no Chrome)
fuente
Rubí, 173
Pruébelo aquí: http://ideone.com/86avbe
Versión legible aquí: http://ideone.com/ynFItB
fuente
['jacklantern','jackslantern','jack-o-lantern']
dict.The output should be ordered by the longer entry;
...and the latter two could be in either order.
Rubí, 211
Decidí tomar un enfoque diferente para resolver esto, usando expresiones regulares.
fuente
Perl 5, 210
El código carga la entrada en una matriz ordenada y comprueba cada valor con todos los valores de la matriz que son 1 byte más largos.
Prueba
fuente
Haskell, 201 bytes
No estoy seguro de qué formato de entrada está permitido.
f
toma una lista de cadenas. Si solo se permite una sola cadena (con nl palabras separadas), agregue.lines
af
(+6 bytes).Ejemplo de uso:
Cómo funciona: cambie cada palabra a minúsculas y conserve solo las letras. Divida cada palabra
x
en dos partes en cada posición posible y haga triples(i,j,k)
dondei
está la primera parte,j
es el primer carácter de la segunda parte yk
es la cola de la segunda parte. Mantenga los triples dondei++k
también aparece en la lista de palabras. Si esta lista no está vacía, tome el primer elemento, llámelo(l,m,n)
. Convierta todos esos encabezados de lista en el formato de salida requerido rodeandom
con()
y colocándolo entrel
yn
.fuente