You are currently viewing Un programme Python pour aider à jouer à Wordle

Un programme Python pour aider à jouer à Wordle

  • Dernière modification de la publication :14 février 2022
  • Temps de lecture :7 min de lecture
  • Commentaires de la publication :0 commentaire

Loading

Un programme Python pour aider à jouer à Wordle peut consister à trier les mots de cinq lettres en fonction de celles que vous avez déjà. Je vous en propose un.

python wordle

Un programme Python pour aider à jouer à Wordle: les prémices

Tout commença lorsque je visionnai la vidéo de Science Étonnante:

Comme David, je n’aime pas ce jeu, mais j’aime bien me casser la tête à écrire de petits programmes. J’ai donc voulu écrire un programme Python me suggérant des mots adéquats en fonction de celles bien placées, celles mal positionnées et celles qui, au contraire, n’étaient pas dans le mot.

Le programme

Voici donc un premier jet:

from unidecode import unidecode

def list_of_words(n):
    L = []
    with open('mots.txt' , encoding = 'utf8') as fic:
        for line in fic:
            L.append(line)
                
    return [ unidecode(i[:-1]) for i in L if len(i[:-1]) == n ]


def wordle(n,D):
    L = list_of_words(n)
    # n = nombre de lettres dans le mot
    # D = dictionnaire des lettres
    # --> déjà trouvées avec leur position  (i.e. 'I':3 : le I est assurément en position 3
    # --> présentes mais mal positionnées (i.e. 'I':'3' : le I est présent mais pas en position 3
    # --> nullement présentes (i.e. 'I':0  : le I n'est assurément pas dans le mot)
    if len( D.items() ) == n and 0 not in D.values() and not isinstance(value,str):
        # si toutes les lettres ont été trouvées
        M = ''
        for i in range(1,n+1):
            M += D[i]
            
        return M
    
    elif len(D) != 0:
        J = {}
        for key,value in D.items():
            J[key] = set()
            for m in L:
                if not isinstance(value,str):
                    if value != 0 and m[value-1] == key and m not in J[key]:
                        J[key].add( m )
                    elif value == 0 and key not in m:
                        J[key].add( m )
                else:
                    if key in m and m[ int(value) ] != key:
                        J[key].add( m )
                        
        list_of_keys = [ key for key,value in D.items() ]
        list_of_possible_words = J[ list_of_keys[0] ]
            
        while len( list_of_keys ) > 1:
            list_of_possible_words = list( set(list_of_possible_words) & J[list_of_keys[-1]] )
            list_of_keys.pop()
                
        return list_of_possible_words
    
    else:
        return list_of_words(n)

Un exemple

Pour commencer, on peut demander à la fonction wordle(5,{}) de nous proposer la liste des mots de 5 lettres:

>>> wordle( 5 , {} )
['ABATS' , 'ABBES' , 'ABCES' , ... ]

On choisit « FIRME ».

Ah tien! On a 3 lettres aux bons endroits! Quelle chance ! Mais le « I » et le « M » ne sont pas dans le mot à trouver. Donc on entre:

>>> wordle( 5 , {'F':1, 'R':3, 'E':5, 'I':0, 'M':0} )
['FOREE', 'FERLE', 'FORTE', 'FARCE', 'FERUE', 'FARTE', 'FORCE', 'FERRE', 'FORGE', 'FARDE']

Le dictionnaire passé en argument comprend les lettres placées aux bons endroits (dans ce cas, la valeur associée à la clé correspond à sa position dans le mot), et les lettres qui ne doivent pas être présentes (dont la valeur est « 0 »).

Je propose « FARCE »:

Zut! Bon, ben j’enrichis mon dictionnaire avec deux lettre en plus qui ne doivent pas être présentes:

>>> print( wordle(5,{'F':1,'R':3, 'E':5, 'I':0, 'M':0, 'A':0, 'C':0}) )
['FORGE', 'FERUE', 'FORTE', 'FOREE', 'FERRE', 'FERLE']

Je propose alors « FORTE »:

C’est mieux! Je complète le dictionnaire avec la lettre « O » placée en position 2:

>>> print( wordle(5,{'F':1,'R':3, 'E':5, 'I':0, 'M':0, 'A':0, 'C':0, 'O':2, 'T':0}) )
['FOREE', 'FORGE']

Allez! Une chance sur deux:je propose « FORGE »:

Ringo !

Je précise que j’ai fait cette « expérience » le 14/02/2022 sur le site https://wordle.louan.me/.

Comme vous avez pu le constater, j’ai décidé d’insérer un paramètre pour le nombre de lettres du mot à deviner, bien que celui-ci soit toujours de longueur 5. Pour être honnête, n’était pas coutumier de ce jeu, je ne savais pas que la longueur du mot était constante au début, donc j’ai mis ce paramètre tout naturellement…

Bien entendu, ce code pourrait être amélioré. Par exemple, j’ai supposé que toutes les lettres étaient d’office en majuscules. On pourrait s’en assurer dans la fonction et, le cas échéant, transformer les minuscules en majuscules.

On pourrait aussi proposer en premier les mots les plus fréquents. On pourrait pour cela s’aider d’un fichier comme celui que l’on peut trouver sur la page https://eduscol.education.fr/186/liste-de-frequence-lexicale. Il y a sans doute d’autres améliorations… à voir!

0 0 votes
Évaluation de l'article
S’abonner
Notification pour
guest
0 Commentaires
Commentaires en ligne
Afficher tous les commentaires