En voici un pour tous les forgerons de mots! Écrivez un programme ou une fonction qui prend une liste de mots et produit une liste de toutes les décompositions concaténatives possibles pour chaque mot. Par exemple:
(Remarque: Il ne s'agit que d'un petit échantillonnage à des fins d'illustration. La production réelle est beaucoup plus volumineuse.)
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, vous avez l'idée. :-)
Règles
- Utilisez n'importe quel langage de programmation de votre choix. Le code le plus court par nombre de caractères pour chaque langue gagne. Cela signifie qu'il y a un gagnant pour chaque langue utilisée. Le gagnant général sera simplement le code le plus court de tous les soumissions.
- La liste d'entrée peut être un fichier texte, une entrée standard ou toute structure de liste fournie par votre langue (liste, tableau, dictionnaire, ensemble, etc.). Les mots peuvent être l'anglais ou toute autre langue naturelle. (Si la liste contient des mots anglais, vous voudrez ignorer ou pré-filtrer les éléments à une seule lettre, sauf pour "a" et "i". De même, pour les autres langues, vous voudrez ignorer les éléments absurdes s'ils apparaissent dans le fichier.)
- La liste de sortie peut être un fichier texte, une sortie standard ou toute structure de liste utilisée par votre langue.
- Vous pouvez utiliser n'importe quel dictionnaire d'entrée que vous aimez, mais vous voudrez probablement en utiliser un qui fournit des mots sensés plutôt qu'un dictionnaire qui fournit trop de mots obscurs, obscurs ou obnubilés. Voici le fichier que j'ai utilisé: la liste Corncob de plus de 58000 mots anglais
Des questions
Ce défi consiste principalement à écrire le code pour accomplir la tâche, mais c'est aussi amusant de parcourir les résultats ...
- Quels sous-mots apparaissent le plus souvent?
- Quel mot peut être décomposé en le plus grand nombre de sous-mots?
- Quel mot peut être décomposé de différentes manières?
- Quels mots sont composés des plus grands sous-mots?
- Quelles décompositions avez-vous trouvées les plus amusantes?
code-golf
string
natural-language
Todd Lehman
la source
la source
alienation
quand j'ai coupé et collé ça. Fixé maintenant. Pour les autres, la liste ci-dessus n'est qu'un petit échantillon. Mon programme de test a généré des dizaines de milliers de réponses lorsqu'il a reçu la liste Corncob.Réponses:
Python 186
Pas particulièrement efficace mais en fait pas terriblement lent. Il naïvement (je suppose que c'est possible, bien que je pense peu probable que python fasse des optimisations intelligentes) vérifie que les sous-mots sont dans le dictionnaire corncob et trouve récursivement autant de mots que possible. Bien sûr, ce dictionnaire est assez complet et vous pouvez en essayer un qui ne comprend pas diverses abréviations et acronymes (conduisant à des choses comme
bedridden: be dr id den
). De plus, le dictionnaire lié ne semblait pas avoir de «A» ou de «I» comme mots, donc je les ai ajoutés manuellement.Éditer:
Maintenant, la première entrée est le nom de fichier du dictionnaire à utiliser, et chaque autre est un mot.
la source
print f
devrait êtreprint(f)
echo archer|python2 filename.py
génère une erreur EOFErrr pour la dernière lignefor f in W(raw_input()):print f
=>''.join(W(raw_input())
;a=open('c').read().split('\n')
=>a=open('c').readlines()
readlines
conserve les caractères de nouvelle ligne à la fin des lignes, c'est pourquoi je l'ai fait comme je l'ai fait.join
que tous les éléments soient des chaînes et je ne peux pas les obtenir sous une forme plus petite que ce que j'ai déjà.Cobra - 160
Il s'agit d'une fonction (sorte de deux fonctions) qui prend un
List<of String>
* et affiche les chaînes contenant les arrangements de sous-mots possibles pour chaque chaîne de la liste d'arguments.* le type est en fait
List<of dynamic?>
, mais fournir autre chose queList<of String>
le cassera probablement.la source
Scala,
132129Edit: légèrement plus court comme une lecture de boucle depuis stdin qu'une fonction
courir comme
(ou utilisez une liste de mots plus longue :))
Original:
Fonction de Seq [String] à Seq [Seq [List [String]]]. Prend le dictionnaire comme arguments de ligne de commande.
Non golfé:
L'approche consiste à générer toutes les listes possibles de sous-chaînes et à filtrer celles qui contiennent une chaîne qui n'est pas dans le dictionnaire. Notez que certaines des sous-chaînes générées contiennent une chaîne vide supplémentaire, je suppose que la chaîne vide ne sera pas dans le dictionnaire (il n'y a aucun moyen de la transmettre de toute façon sur la ligne de commande).
la source