Recherche du groupe de lettres fournissant le plus grand nombre d’anagrammes¶
Algorithme¶
Pour répondre à ce problème, nous allons d’abord construire un dictionnaire dont :
les clefs sont des ensembles de lettres (triées par ordre croissant) ;
les valeurs sont l’ensemble des mots pouvant être formés avec ce groupe de lettres.
Ceci va donner un dictionnaire du genre
{
"aimr": {"mari", "rima"},
"cehin": {"chien", "chine", "niche"},
}
Ce dictionnaire se construit avec le code suivant (le vrai code est un chouïa plus compliqué, puisque cet exemple ne tient pas compte des arguments accents
et majuscules
):
groupes = collections.defaultdict(set)
for mot in dictionnaire:
clef = "".join(sorted(mot))
groupes[clef].add(mot)
Remarquons qu’en utilisant un collections.defaultdict
, nous n’avons même pas à initialiser une valeur avec un ensemble vide si la clef est rencontrée pour la première fois.
Il suffit ensuite de rechercher, dans ce dictionnaire, quel est le groupe de mots le plus grand. Ceci ce fait par un simple parcours des clefs.
Résultats¶
Les listes de mots utilisées ici sont celles fournies avec le dictionnaire aspell, sous Debian.
Français¶
Accepter ou non les noms propres (avec l’option majuscules
) ne modifie pas les résultats. Nous obtenons :
En ignorant les accents, il est possible de former 19 mots avec les mêmes lettres :
arisent entrais insérât ratines ratinés rentais riantes résinât satiner sentira serinât sériant taniser tarsien traines transie traînes traînés tsarine
En tentant compte des accents, il est possible de former 13 mots avec les mêmes lettres :
ratisse restais retissa satires staries starise tarisse tersais tirasse tiseras tissera tressai triasse
Anglais¶
Sans surprise, tenir compte ou non des accents ne change rien en langue anglaise.
Sans les noms propres, il est possible de former 8 anagrammes avec le même ensemble de lettres :
aster rates resat stare tares taser tears treas
Avec les noms propres, il est possible de former 8 anagrammes avec le même ensemble de lettres, de trois manières différentes.
Gore Oreg Roeg ergo goer gore ogre rego
aster rates resat stare tares taser tears treas
Stael Tesla least slate stale steal tales teals
Ligne de commande¶
Recherche l’ensemble de lettres qui produit le plus grand nombre d’anagrammes.
usage: anagrammes.clique [-h] [-a ACCENTS] [-m MAJUSCULES] [dict ...]
Positional Arguments¶
- dict
Dictionnaires dans lesquels aller chercher les mots, sous la forme de fichiers de mots séparés par des espaces ou des sauts de ligne. Les autres caractères sont ignorés. Accepte aussi des arguments sous la forme “aspell://fr”, qui charge tous les mots de la langue “fr” connus du dictionnaire Aspell.
Named Arguments¶
- -a, --accents
Considère les lettres accentuées comme distinctes des lettres non accentuées.
Default:
True
- -m, --majuscules
Accepte (ou non) les mots commençant par une majuscule (utile pour exclure les noms propres).
Default:
False