J'ai un cadenas à combinaison qui a des lettres au lieu de chiffres. Il ressemble à ceci: http://pictures.picpedia.com/2012/09/Word_Combination_Padlock.jpg Il y a 5 bobines, chacune ayant 10 lettres différentes dessus.
La plupart des gens aiment utiliser un mot pour leur combinaison plutôt qu'une chaîne arbitraire de lettres. (Moins sûr, bien sûr, mais plus facile à retenir.) Ainsi, lors de la fabrication du verrou, il serait bon de le construire pour avoir une combinaison de lettres qui peut être utilisée pour créer autant de mots anglais à 5 lettres que possible.
Votre tâche, si vous l'acceptez, est de trouver une affectation de lettres aux bobines qui permettra de créer autant de mots que possible. Par exemple, votre solution peut être
ABCDEFGHIJ DEFGHIJKLM ZYXWVUTSR ABCDEFGHIJ ABCDEFGHIJ
(Si vous ne vous sentiez pas trop imaginatif, c'est).
Par souci de cohérence, veuillez utiliser la liste de mots sur http://www.cs.duke.edu/~ola/ap/linuxwords
Tout mot de 5 lettres dans cette liste est OK, y compris les noms propres. Ignorez Sino- et L'vov et tous les autres mots de la liste qui contiennent un caractère non az.
Le programme gagnant est celui qui produit le plus grand nombre de mots. Dans le cas où plusieurs programmes trouveraient le même résultat, le premier à être publié l'emporterait. Le programme devrait s'exécuter en moins de 5 minutes.
Edit: depuis que l'activité s'est calmée et qu'aucune meilleure solution n'est sortie, je déclare Peter Taylor vainqueur! Merci à tous pour vos solutions inventives.
la source
Réponses:
1275 mots par simple escalade gourmande
Le code est C #. La solution produite est
J'utilise ce format de sortie car il est vraiment facile à tester:
la source
Main
méthode pour appeler différentes_Main
méthodes.Python (3), 1273 ≈ 30,5%
C'est une approche vraiment naïve: garder un décompte de la fréquence de chaque lettre dans chaque position, puis éliminer la "pire" lettre jusqu'à ce que les lettres restantes tiennent sur les rouleaux. Je suis surpris que cela semble si bien fonctionner.
Ce qui est le plus intéressant, c'est que j'ai presque exactement la même sortie que la solution C # 1275, sauf que j'ai une
N
sur ma dernière bobine à la placeA
. C'était aussiA
ma 11e à la dernière élimination, même avant de jeter aV
et aG
.Produit:
la source
Mathematica , 1275 mots encore et encore ...
Ce code n'est pas Golfé car la question ne semble pas appeler cela.
Le nombre de mots rapidement (moins de 10 secondes) évolue à 1275 sur la plupart des pistes mais ne dépasse jamais cela. J'ai essayé de perturber les lettres de plus d'une à la fois pour essayer de sortir d'un maximum local théorique, mais cela n'a jamais aidé. Je soupçonne fortement que 1275 est la limite pour la liste de mots donnée. Voici un parcours complet:
Voici quelques autres sélections "gagnantes":
Comme Peter le fait remarquer, ce sont en fait la même solution dans des ordres différents. Trié:
la source
shortlist
semble long, et bien que ce ne soit pas Golf, j'aimerais quelque chose de plus court. Pouvez-vous m'aider?Python, 1210 mots (~ 29%)
En supposant que j'ai compté les mots correctement cette fois, c'est légèrement mieux que la solution de FakeRainBrigand. La seule différence est que j'ajoute chaque bobine dans l'ordre, puis que je supprime tous les mots de la liste qui ne correspondent pas à la bobine afin d'obtenir une distribution légèrement meilleure pour les bobines suivantes. Pour cette raison, il donne exactement la même première bobine.
Les résultats du programme
la source
iPython (
273210 octets, 1115 mots)1115/4176 * ~ 27%
Je les ai calculés dans iPython, mais mon historique (coupé pour supprimer le débogage) ressemblait à ceci.
Si nous allons court; Je pourrais le couper à cela.
Raccourci:
Mes résultats étaient les suivants :
['sbcapfdtmg', 'aoeirulhnt', 'aironeluts', 'etnlriaosc', 'seyrdtnlah']
.* Mes calculs sur le 4176 peuvent être un peu courts en raison de l'omission de mots avec des tirets ou des apostrophes
la source
Q
? (todo) mots
Les mots doivent être stockés dans un fichier appelé
words
Fonctionne en environ 170 ms sur mon i7. Il analyse la liste de mots, recherchant la lettre la plus courante dans chaque poste (filtrant évidemment les non-candidats). C'est une solution naïve paresseuse mais produit un résultat raisonnablement bon avec un code minimal.
Résultats:
la source
Éditer: Maintenant que les règles ont été modifiées, cette approche est disqualifiée. Je vais le laisser ici au cas où quelqu'un serait intéressé jusqu'à ce que je finisse par le modifier pour les nouvelles règles.
Python: 277 caractères
Je suis presque sûr que la version généralisée de ce problème est NP-Hard, et la question ne nécessitait pas de trouver la solution la plus rapide , alors voici une méthode de force brute pour le faire:
Notez que j'ai renommé le fichier de liste de mots en "w" pour enregistrer quelques caractères.
La sortie est le nombre de mots possibles à partir d'une configuration donnée suivie de la configuration elle-même:
La dernière ligne de sortie avant la fin du programme est garantie d'être la solution optimale.
la source