Disons que vous avez une liste de mots et que vous voulez pouvoir utiliser des cartes-lettres pour épeler chaque mot. Par exemple, pour épeler chat , vous utiliseriez trois cartes étiquetées C, A, T.
En supposant que chaque carte est recto-verso , soumettez un programme pour définir un nombre minimum de cartes pouvant être utilisées pour épeler la liste complète des mots.
L'entrée est la liste de mots, elle peut être basée sur un fichier, codée en dur, en ligne de commande, peu importe. La sortie est la liste des cartes, formatées et ordonnées comme bon vous semble, à condition que le libellé des cartes soit clair.
Le cas n'est pas significatif: Golf, golf et GOLF sont équivalents.
Quelques conseils:
- le nombre de cartes ne peut être inférieur à la longueur du mot le plus long
- cela n'a aucun sens pour une carte d'avoir la même lettre des deux côtés
- Bien que la casse ne soit pas significative, recommandez les minuscules pour profiter de certaines symétries
Exemples, ceux-ci profitent de certaines symétries :
Entrée: ben, bog, bug, den, do, doe, dog, due, creused, Ed, end, gob, God, Ned, ode, pen, Poe, pug
Sortie: b / d, e / g, o / n
Entrée: un, et, singe, sont, être, lit, bourgeon, bur, Dan, Deb, dub, oreille, Ed, ère, sieste, pan, pois, pub, Rae, couru, frotter
Sortie: a / b, d / r, e / n
En faire un concours de popularité, donc l'élégance du code, les performances d'exécution et l'intelligence (y compris le pliage des règles et les failles) sont importantes!
Addition : Certains ont demandé des symétries "autorisées", si des polices spéciales peuvent être utilisées et si les cartes peuvent être pliées.
Les symétries autorisées sont toutes les lettres qui se ressemblent après une rotation de 0, 90, 180 ou 270 degrés. Cela inclut b / q, d / p et n / u. Je dirais aussi M / W, Z / N, et bien sûr I / l (i majuscule, L minuscule). Je suis probablement en train de gratter la surface, donc s'il y en a d'autres dont vous n'êtes pas sûr, demandez simplement.
Pour rester simple, veuillez vous limiter à une police standard sans empattement, par exemple celle utilisée dans SE.
En ce qui concerne le pliage, alors que vous pouvez faire des substitutions incroyables, par exemple, B peut être D, E, F, I, P ou R, et peut-être C ou L si vous vous pliez vraiment de manière créative, je pense que cela se plie, littéralement, trop !
J'ai rencontré ce problème en jouant avec des cartes similaires avec mes enfants. J'ai remarqué à quel point il était facile de créer des cartes recto par rapport à la difficulté de trouver des cartes recto verso.
Addition : avoir fourni une prime à attribuer à la réponse la plus populaire. S'il y a égalité, sera attribué à celui qui a soumis en premier.
Un autre indice:
- résoudre le problème simple face vous donnera une idée du nombre minimum de cartes nécessaires (par exemple, 20 cartes simple face se traduisent par au moins 10 cartes double face nécessaires)
Addition : Oh, dérange, j'étais occupé et j'ai oublié l'expiration de la prime. Cela n'a fini par aller à personne car la seule réponse a été soumise avant le début de la prime! Désolé pour ça.
n/u
,d/p
? Et pourb/q
etm/w
? Et si je plie uneP
carte en deux pour que la moitié supérieure devienneD
?Réponses:
C # - CardChooser
Sommaire
Cette application utilise une méthode de force brute pour tenter de résoudre chaque liste. Je crée d'abord une liste de cartes potentielles parmi lesquelles choisir, puis je détermine laquelle est la plus adaptée (supprime le plus de caractères + raccourcit le plus les mots), l'ajoute à une liste de résultats et continue ce processus jusqu'à ce que j'aie sélectionné suffisamment de cartes potentielles pour supprimer chaque mot de la liste, je rematch ces cartes à chaque mot et j'imprime la sortie.
Si vous souhaitez voir une version plus limitée de ce code sans télécharger et créer l'application Windows Forms fournie, vous pouvez utiliser le lien fourni pour exécuter mon programme sur des ensembles de données plus petits, veuillez noter qu'il s'agit de la version de l'application console, donc le résultat les cartes NE sont PAS tournées: http://ideone.com/fork/VD1gJF
Historique des révisions
Actuel - Ajout d'une meilleure optimisation des résultats suggérée par @Zgarb
Mise à jour 3 - Plus de nettoyage de code, plus de bugs corrigés, de meilleurs résultats
Mise à jour 2 - Windows Forms, sortie plus détaillée
Mise à jour 1 - Nouveau / meilleur support pour les symétries de caractères
Original - Application console
Exemples
acr, arrière, ain, sll, gagner, disons, dit, rapide, épique
hes, sera, avec, ne serait pas, serait, wouldve, wouldnt, pourtant, vous, youd, youll
aaaa, bbbb, cccc
Code
Je dois encore combiner cela en un projet plus grand avec le code ConsoleApp et WindowsForms partageant tous les mêmes classes et méthodes, puis diviser les différentes régions dans la méthode RunButton_Click afin que je puisse écrire des unités autour d'eux, de toute façon chaque fois que je trouve le temps de le faire Je vais, pour l'instant voici ce que j'ai:
la source
i
carte?said
la dernière lettre de W n'est pas W ou p