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 ».

Screenshot_20191126-002255_Garden of Words
Screenshot_20191126-002623_Garden of Words

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.

Laisser un commentaire