18 Commits

Author SHA1 Message Date
fc93178303 Nettoyage 2022-01-24 22:22:40 +01:00
e4b517168a Fonction "Pattern" 2022-01-24 22:15:17 +01:00
e2452c1434 Fonction "Bad Letters" 2022-01-24 21:46:06 +01:00
f9cf15d487 Fonction "Know Letters" 2022-01-24 21:05:06 +01:00
758d6bb0bb Nettoyage 2022-01-24 20:21:54 +01:00
cb17864265 Fonction "First Try" 2022-01-24 20:16:31 +01:00
0a8c29de74 Réorganisation du code 2022-01-24 19:44:49 +01:00
8b9175454b Ajout de l'option "no double" 2022-01-24 19:30:24 +01:00
ebea271d49 Préparation pour l'affichage des résultats 2022-01-24 19:05:38 +01:00
90aab55b75 Simplification de l'argument du nombre de lettre 2022-01-24 18:51:54 +01:00
1563e1bf1d Fonction pour charger le dictionnaire et début de mise en forme du programme 2022-01-24 18:50:29 +01:00
5e60b32352 Fonction pour la longueur du mot 2022-01-24 18:39:40 +01:00
ba5600e65f Fonction pour la première lettre 2022-01-24 18:33:52 +01:00
78586d42f0 Simplification du argparse 2022-01-24 17:31:21 +01:00
b6f5850b84 Comme l'on a des arguments obligatoires, pas de besoin de vérifier s'il y en a. 2022-01-24 16:56:04 +01:00
9dbc9fc89d Ouvre le dictionnaire avec un 'with statement' 2022-01-24 16:52:59 +01:00
57c87fe986 import os : pas besoin 2022-01-24 16:48:38 +01:00
971f078ee2 Python3 2022-01-24 16:47:29 +01:00
6 changed files with 149494 additions and 5133 deletions

View File

@@ -1,19 +1,16 @@
# wgamesolv # wgamesolv
WARNING : le dictionnaire fr_FR.json n'est plus à jour. Il doit soit être mis à jour soit remplacé par des dictionnaires de mots en x lettres, comme le nouveau fr_A_10letters.json (mots de 10 lettres commençants par la letre A) qui lui est à jour (le 26 fév. 2026).
Words Games Solver. Words Games Solver.
Script d'aide à la résolution des jeux de mots style Wordle, SUTOM, mots-croisés, Scrabble... Script d'aide à la résolution des jeux de mots style wordle
On a fait ça pour s'amuser, pas spécialement pour tricher aux jeux de mots.
Auteurs : AntoineVe, Brunus.
Courageux testeur des 1ères versions et précieux apporteur d'idées: DarKou.
Licence : MIT
Utilisation : wgamesolv.py -d dictionnaire.json -nb 7 (autres options) Utilisation : wgamesolv.py -fl L -nb 7 (autres options)
-d, --dictionary : dictionnaire à utiliser -d, --dictionary : dictionnaire à utiliser
ex : -d fr_Fc.json ex : -d SutomList.json
Trois dictionnaires ont été fusionnés pour n'en faire qu'un : Wordle, SUTOM et l'officiel du Scrabble Les dictionnaires sont récupérables ici :
https://framagit.org/JonathanMM/sutom/-/blob/main/ts/mots/listeMotsProposables.ts
Et :
https://raw.githubusercontent.com/LouanBen/wordle-fr/main/mots.txt
-fl, --firstLetter : première lettre du mot -fl, --firstLetter : première lettre du mot
ex : -fl C ex : -fl C
@@ -25,7 +22,7 @@ ex : -nb 7
-ft, --firstTry : optimise le premier essai en sortant les mots de -nb lettres, commençant par -fl lettre, ne contenant aucune lettre en plusieurs occurence et contenant -ft voyelles. -ft, --firstTry : optimise le premier essai en sortant les mots de -nb lettres, commençant par -fl lettre, ne contenant aucune lettre en plusieurs occurence et contenant -ft voyelles.
ex : -ft 4 ex : -ft 4
Cette option peut être utilisée pour le tout premier essai, pour optimiser les chances d'avoir des lettres validées. Cette option peut être utilisée pour le tout premier essai, pour optimiser les chances d'avoir des lettres validées.
Cette option est ensuite inutile ou contre-productive pour les essais suivants et ne peut pas être utilisée avec la pattern. Cette option est ensuite inutile ou contre-productive pour les essais suivants.
-nd, --noDoubleLetters : filtre les mots composé d'une seule occurence de chaque lettre. -nd, --noDoubleLetters : filtre les mots composé d'une seule occurence de chaque lettre.
@@ -35,8 +32,7 @@ ex : -kl AEP
-bl, --badLetters : lettres déjà invalidées -bl, --badLetters : lettres déjà invalidées
ex : -bl ZTOR ex : -bl ZTOR
-p, --pattern : lettres validées et bien placées, lettres connues et mal placées, séparée par des '.' pour les lettres non validées -p, --pattern : lettres validées et bien placées, séparée par des '.' pour les lettres non validées
Les lettres en caps sont les lettres connues et bien placées, les lettres en minuscules sont les lettres connues mais mal placées ex : -p L..I... (le mots était LUCIOLE)
ex : -p L.uI... (le mots était LUCIOLE)
Exemple complet : wgamesolv.py -d fr_FR.json -nb 7 -fl L -p L.uI... -kl U -bl AMNR Exemple complet : wgamesolv.py -d SutomList.json -nb 7 -fl L -p L..I... -kl E -bl AMNR

149442
SutomList.json Normal file

File diff suppressed because it is too large Load Diff

1
WordleList.json Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -3,7 +3,6 @@
import json import json
import argparse import argparse
from random import shuffle
def load_dict(dict_file): def load_dict(dict_file):
@@ -20,38 +19,34 @@ def noDouble(mots):
# Fonction d'élimination de mots contenant plusieurs occurences de lettres # Fonction d'élimination de mots contenant plusieurs occurences de lettres
ndList = [] ndList = []
for mot in mots: for mot in mots:
if len(list(mot)) == len(set(list(mot))): llist = []
for lettre in mot:
if lettre not in llist:
llist.append(lettre)
if len(mot) == len(llist):
ndList.append(mot) ndList.append(mot)
return ndList return(ndList)
def firstTryFilter(mots, max_mots, pattern): def firstTryFilter(mots, max_mots):
''' '''
First Try : sélectionne des mots ayant des chances de valider ou invalider First Try : sélectionne des mots ayant des chances de valider ou invalider
l'une des lettres les plus utilisée en français. l'une des lettres les plus utilisée en français
''' '''
if pattern:
return mots # Inhibe le filtre si on utilise aussi un pattern
else:
bestLetters = ['E', 'A', 'I', 'R', 'S', 'N', 'T', 'O', 'L', 'U'] bestLetters = ['E', 'A', 'I', 'R', 'S', 'N', 'T', 'O', 'L', 'U']
bestWords = [] bestWords = []
shuffle(mots)
mots = mots[:100]
for mot in mots: for mot in mots:
for bestLetter in bestLetters: for bestLetter in bestLetters:
if bestLetter in mot: if bestLetter in mot:
bestWords.append(mot) bestWords.append(mot)
bestWords = list(set(bestWords)) bestWords = list(set(bestWords))
bestWords_noDouble = noDouble(bestWords) # Autant maximiser les chances bestWords = noDouble(bestWords) # Autant maximiser les chances
if len(bestWords_noDouble) > 0: bestWords = bestWords[0:max_mots]
bestWords = bestWords_noDouble return(bestWords)
bestWords = bestWords[:max_mots]
return bestWords
def resolv_fl(liste, firstletter): def resolv_fl(liste, firstletter):
# On ne garde que les mots qui commence par FirstLetter # On ne garde que les mots qui commence par FirstLetter
firstletter = firstletter.upper()
return [mot for mot in liste if mot[0] == firstletter] return [mot for mot in liste if mot[0] == firstletter]
@@ -62,12 +57,10 @@ def resolv_len(liste, lenght):
def resolv_pattern(liste, pattern): def resolv_pattern(liste, pattern):
# Pattern : élimination des mots ne satisfaisant pas la pattern # Pattern : élimination des mots ne satisfaisant pas la pattern
pattern_dict, not_pattern_dict = {}, {} pattern_dict = {}
for lettre in pattern: for lettre in pattern:
if lettre != "." and lettre.isupper(): if lettre != ".":
pattern_dict.update({pattern.index(lettre): lettre}) pattern_dict.update({pattern.index(lettre): lettre})
if lettre != "." and lettre.islower():
not_pattern_dict.update({pattern.index(lettre): lettre.upper()})
MotsOK, MotsKO = [], [] MotsOK, MotsKO = [], []
for mot in liste: for mot in liste:
for key in pattern_dict: for key in pattern_dict:
@@ -75,10 +68,6 @@ def resolv_pattern(liste, pattern):
MotsOK.append(mot) MotsOK.append(mot)
else: else:
MotsKO.append(mot) MotsKO.append(mot)
for key in not_pattern_dict:
if mot[key] == not_pattern_dict[key]:
MotsKO.append(mot)
MotsKO = set(MotsKO)
liste = [mot for mot in MotsOK if mot not in MotsKO] liste = [mot for mot in MotsOK if mot not in MotsKO]
liste = list(set(liste)) liste = list(set(liste))
return liste return liste
@@ -89,7 +78,7 @@ def resolv_kl(liste, lettres):
Known Letters : élimination des mots ne comprenant pas Known Letters : élimination des mots ne comprenant pas
les lettres validées (hors pattern) les lettres validées (hors pattern)
''' '''
lettres = list(set(list(lettres.upper()))) lettres = list(set(list(lettres)))
MotsRestants = [] MotsRestants = []
for mot in liste: for mot in liste:
if len(set(lettres).intersection(mot)) == len(lettres): if len(set(lettres).intersection(mot)) == len(lettres):
@@ -102,13 +91,18 @@ def resolv_bl(liste, lettres):
Bad Letters : élimination des mots contenant Bad Letters : élimination des mots contenant
des lettres invalidées (hors pattern) des lettres invalidées (hors pattern)
''' '''
lettres = list(set(list(lettres.upper()))) lettres = list(set(list(lettres)))
MotsSuppr = [] MotsSuppr = []
for mot in liste: for mot in liste:
for lettre in lettres: for lettre in lettres:
if lettre in mot: if lettre in mot:
MotsSuppr.append(mot) MotsSuppr.append(mot)
return [mot for mot in liste if mot not in MotsSuppr] for mot in MotsSuppr:
try:
liste.pop(liste.index(mot))
except ValueError:
pass
return liste
if __name__ == "__main__": if __name__ == "__main__":
@@ -125,7 +119,8 @@ if __name__ == "__main__":
'-fl', '-fl',
'--firstLetter', '--firstLetter',
help='Première lettre', help='Première lettre',
default=False default=False,
required=True
) )
parser.add_argument( parser.add_argument(
'-nb', '-nb',
@@ -151,7 +146,7 @@ if __name__ == "__main__":
'-p', '-p',
'--pattern', '--pattern',
default=False, default=False,
help='Placement : bien placée en majuscule, mal placée en minuscule et non existante par un \'.\'. E.g. : Ra..e.T' help='Placement, avec des "." pour les inconnues : -p A...T.I.'
) )
parser.add_argument( parser.add_argument(
'-nd', '-nd',
@@ -176,18 +171,11 @@ if __name__ == "__main__":
liste = load_dict(args.dictionary) liste = load_dict(args.dictionary)
liste = resolv_len(liste, args.nbLetters) liste = resolv_len(liste, args.nbLetters)
if args.firstLetter:
liste = resolv_fl(liste, args.firstLetter) liste = resolv_fl(liste, args.firstLetter)
if args.pattern:
liste = resolv_pattern(liste, args.pattern)
if args.noDoubleLetters: if args.noDoubleLetters:
liste = noDouble(liste) liste = noDouble(liste)
if args.knownLetters:
liste = resolv_kl(liste, args.knownLetters)
if args.badLetters:
liste = resolv_bl(liste, args.badLetters)
if args.firstTry: if args.firstTry:
liste = firstTryFilter(liste, args.firstTry, args.pattern) liste = firstTryFilter(liste, args.firstTry)
if len(liste) == 1: if len(liste) == 1:
print(f"Essaie : \"{liste[0]}\"") print(f"Essaie : \"{liste[0]}\"")
elif len(liste) > 1: elif len(liste) > 1:
@@ -195,6 +183,12 @@ if __name__ == "__main__":
else: else:
print("Hmmm... Je crois qu'on s'est perdu...") print("Hmmm... Je crois qu'on s'est perdu...")
exit(0) exit(0)
if args.knownLetters:
liste = resolv_kl(liste, args.knownLetters)
if args.badLetters:
liste = resolv_bl(liste, args.badLetters)
if args.pattern:
liste = resolv_pattern(liste, args.pattern)
if len(liste) > 1: if len(liste) > 1:
print(liste) print(liste)
print(f"Il y a {len(liste)} mots dans la liste") print(f"Il y a {len(liste)} mots dans la liste")