¡Aquí hay uno para todos ustedes, forjadores de palabras! Escriba un programa o función que tome una lista de palabras y produzca una lista de todas las posibles descomposiciones concatenantes para cada palabra. Por ejemplo:
(Nota: este es solo un pequeño muestreo con fines ilustrativos. La producción real es mucho más voluminosa).
afterglow = after + glow
afterglow = aft + erg + low
alienation = a + lie + nation
alienation = a + lien + at + i + on
alienation = a + lien + at + ion
alienation = alien + at + i + on
alienation = alien + at + ion
archer = arc + her
assassinate = ass + as + sin + ate
assassinate = ass + ass + in + ate
assassinate = assassin + ate
backpedalled = back + pedal + led
backpedalled = back + pedalled
backpedalled = backpedal + led
goatskin = go + at + skin
goatskin = goat + skin
goatskin = goats + kin
hospitable = ho + spit + able
temporally = tempo + rally
windowed = win + do + wed
windowed = wind + owed
weatherproof = we + at + her + pro + of
yeasty = ye + a + sty
Ok, ya tienes la idea. :-)
Reglas
- Use cualquier lenguaje de programación de su elección. El código más corto por conteo de caracteres para cada idioma gana. Esto significa que hay un ganador por cada idioma utilizado. El ganador general será simplemente el código más corto de todos los presentados.
- La lista de entrada puede ser un archivo de texto, entrada estándar o cualquier estructura de lista que proporcione su idioma (lista, matriz, diccionario, conjunto, etc.). Las palabras pueden ser inglés o cualquier otro idioma natural. (Si la lista es palabras en inglés, querrá ignorar o filtrar previamente los elementos de una sola letra, excepto "a" e "i". Del mismo modo, para otros idiomas, querrá ignorar los elementos sin sentido si aparecer en el archivo)
- La lista de salida puede ser un archivo de texto, salida estándar o cualquier estructura de lista que utilice su idioma.
- Puede usar cualquier diccionario de entrada que desee, pero probablemente desee usar uno que proporcione palabras sensatas en lugar de uno que proporcione demasiadas palabras oscuras, arcanas u obnubiladas. Este es el archivo que utilicé: la lista de Corncob de más de 58000 palabras en inglés
Preguntas
Este desafío se trata principalmente de escribir el código para realizar la tarea, pero también es divertido analizar los resultados ...
- ¿Qué subpalabras ocurren más comúnmente?
- ¿Qué palabra se puede descomponer en la mayor cantidad de subpalabras?
- ¿Qué palabra se puede descomponer de las maneras más diferentes?
- ¿Qué palabras se componen de las subpalabras más grandes?
- ¿Qué descomposiciones encontraste que fueron las más divertidas?
code-golf
string
natural-language
Todd Lehman
fuente
fuente
alienation
cuando corté y pegué eso. Corregido ahora. En términos de los demás, la lista anterior es solo una pequeña muestra. Mi programa de prueba generó decenas de miles de respuestas cuando se le dio la lista de Corncob.Respuestas:
Python 186
No es particularmente eficiente pero en realidad no es terriblemente lento. Simplemente ingenuamente (supongo que es posible, aunque creo que es poco probable que Python haga algunas optimizaciones inteligentes) comprueba que las sub-palabras están en el diccionario de mazorcas de maíz y encuentra recursivamente tantas palabras como sea posible. Por supuesto, este diccionario es bastante extenso y puede probar uno que no incluya varias abreviaturas y siglas (que conducen a cosas como
bedridden: be dr id den
). Además, el diccionario vinculado no parecía tener 'A' o 'I' enlistadas como palabras, así que las agregué manualmente.Editar:
Ahora la primera entrada es el nombre de archivo del diccionario a utilizar, y cada uno adicional es una palabra.
fuente
print f
debería serprint(f)
echo archer|python2 filename.py
genera un EOFError para la última líneafor f in W(raw_input()):print f
=>''.join(W(raw_input())
;a=open('c').read().split('\n')
=>a=open('c').readlines()
readlines
mantiene los caracteres de nueva línea al final de las líneas, por eso lo hice como lo hice.join
que todos los elementos son cadenas y no puedo obtenerlo en una forma más pequeña de lo que ya tengo.Cobra - 160
Esta es una función (tipo de dos funciones) que toma un
List<of String>
* e imprime las cadenas que contienen los posibles arreglos de subpalabras para cada cadena en la lista de argumentos.* el tipo es en realidad
List<of dynamic?>
, pero proporcionar algo más queList<of String>
probablemente lo romperá.fuente
Scala,
132129Editar: ligeramente más corto como una lectura de bucle de stdin que una función
correr como
(o use una lista de palabras más larga :))
Original:
Función de Seq [String] a Seq [Seq [List [String]]]. Toma el diccionario como los argumentos de la línea de comando.
Sin golf:
El enfoque consiste en generar todas las listas posibles de subcadenas y filtrar aquellas que contienen una cadena que no está en el diccionario. Tenga en cuenta que algunas de las subcadenas generadas contienen una cadena vacía adicional, supongo que la cadena vacía no estará en el diccionario (de todos modos, no hay forma de pasarla en la línea de comando).
fuente