Nous avons maintenant un fichier pouvant fournir toutes les anagrammes pour un ensemble de lettres donné. Nous allons maintenant écrire un petit script de test et vérifier si cela nous permet de résoudre une grille du jeux « Jardin des mots ».
TestLexiconGOW.py
Le fichier se trouve ici : https://github.com/Angorange/Garden-Of-Words/blob/master/software/tools/TestLexiconGOW.py
La fonction ‘test_find_anagrams‘ se contente de charger le fichier d’anagrammes, d’hasher les lettres passées en paramètre, de générer toutes les combinaisons de clés possible et d’afficher les résultats s’il y en a.
Par exemple, le mot CHAINE, qui a pour clé ACEHIN, contient les lettres CEHIN qui est la clé pour NICHE et CHIEN.
Il suffit de générer toutes les combinaisons de lettres possibles, et si une combinaison correspond à une clé existante, alors les mots correspondant seront ajoutés au résultat.
La fonction « generate_combinations » génère toutes les sous-clés potentiellement valides pour une clé donnée.
# From the itertools page : https://docs.python.org/3/library/itertools.html#itertools-recipes # Generates all combinations possible def powerset(iterable): "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)" s = list(iterable) return chain.from_iterable(combinations(s, r) for r in range(len(s)+1)) # Uses powerset to generate all combinations # Hashes each element of the combinations # Removes duplicate # Returns the list def generate_combinations(key): result = powerset(key) result = (hash_word(r) for r in result) # Removing duplicates result = dict.fromkeys(result) return result
La fonction « find_included_anagrams » génère une liste contenant tous les mots correspondants à la clé principale et les mots correspondant au sous-clés.
def find_included_anagrams(key, anagrams_dic): combinations = generate_combinations(key) result = list() for combination_key in combinations: if combination_key in anagrams_dic: result = result + anagrams_dic[combination_key] # Removing duplicates result = list(dict.fromkeys(result)) return result
IDANVE
Nous allons valider notre lexique avec cette grille du « Jardin des mots ».
Dans la ligne de commande j’exécute TestLexiconGOW.py avec IDANVE comme paramètre :
> python TestLexiconGOW.py IDANVE
Ce qui donne :
Anagrams for DANVIE : 58
6 letters ( 3 ): ['DEVINA', 'ENVIDA', 'VIANDE']
5 letters ( 16 ): ['AVIDE', 'AVIEN', 'AVINE', 'DAINE', 'DENIA', 'DEVIA', 'DEVIN', 'DIANE', 'DIVAN', 'ENVIA', 'EVIDA', 'NAEVI', 'NAIVE', 'VAINE', 'VEINA', 'VENDA']
4 letters ( 22 ): ['ADNE', 'AIDE', 'AINE', 'AVEN', 'DENI', 'DEVI', 'DINA', 'DINE', 'DIVA', 'DIVE', 'ENVI', 'INDE', 'NAVE', 'NIDA', 'NIVE', 'VAIN', 'VEDA', 'VEND', 'VIDA', 'VIDE', 'VINA', 'VINE']
3 letters ( 17 ): ['AID', 'AIE', 'ANE', 'ANI', 'AVE', 'DAN', 'DIA', 'DIN', 'IDE', 'IVE', 'NIA', 'NID', 'NIE', 'VAN', 'VIA', 'VIE', 'VIN']
C’est un succès !
Prochaine étape, extraire les lettres directement de l’écran du téléphone.