Fichiers

Yofure Messages postés 26 Date d'inscription samedi 18 juillet 2009 Statut Membre Dernière intervention 8 octobre 2011 - 21 mai 2009 à 15:57
Yofure Messages postés 26 Date d'inscription samedi 18 juillet 2009 Statut Membre Dernière intervention 8 octobre 2011 - 3 juin 2009 à 20:01
Bien le bonjour à tous.
Je suis débutant en programmation (et nouveau sur le forum ^^).

Je voudrais créer un programme qui teste toutes les permutations possibles entre des lettres données et qui en tire les mots existants dans la langue française, ou au moins qui teste jusqu'à en tirer au moins un mot français.

Ainsi, j'avais l'idée de mettre chaque lettre dans une série de variables 1, de donner un nombre aléatoire à une autre série variables 2, de ranger les variables deux dans l'ordre croissant, de faire aller de paire la variable 2a avec la variable 1a, etc, pour obtenir un mot. Ensuite le mot serait testé, pour voir s'il n'existe pas déjà dans une liste des mots créés auparavant, si il a déjà été "fabriqué", on recommence l'opération, et s'il ne l'a pas encore été, on l'ajoute à la liste des mots créés et on essaie de voir s'il existe dans une liste de mots français existants.
Pour obtenir cette liste de mots existants, j'ai téléchargé une liste de 22xxx mots (me semble-t-il) au format .txt, liste que j'avais vue conseillée dans un code posté sur ce site, pour un jeu du pendu. Seulement voilà, je n'ai encore jamais utilisé de fichiers, j'ai regardé un peu dans mon "cours" (celui de G. Swinnen)... Mais je ne sais pas comment faire pour apporter les 22000 mots à tester dans le programme sans le faire buguer... De même, le nombre de permutations possibles entre les lettres est plutôt très grand, la liste des mots déjà créés grossit vite et en arrive très vite à faire buguer le programme.

Ainsi, je me présente sur ce forum pour obtenir les conseils de personnes plus expérimentées que moi qui pourront (je l'espère) m'aider. Je vous pose donc les deux questions qui suivent :
- Poursuivant le but que je poursuis, ma méthode est-elle vraiment bonne et réalisable, ou voyiez vous un moyen plus ingénieux ?
- Pourriez vous m'éclairer sur la façon dont je peux apporter mes 22xxx mots dans mon programme , puisque lorsque j'utilise la fonction readlines(), ça a vite fait de buguer ?

Merci d'avance. :)

2 réponses

cs_gaulthier Messages postés 9 Date d'inscription samedi 2 juin 2007 Statut Membre Dernière intervention 3 juin 2009
31 mai 2009 à 16:44
Pour la permutation, je n'ai pas tout a fait compris la méthode que tu utilises !

Pour la recherche dans le fichier, fait la a la fin des permutations en faisant un truc du genre:




lst_mot_ok = []
fichier = open(nom_du_fichier, 'r')
for mot in fichier:
    if mot in lst_permutation:
        lst_mot_ok.append(mot)

je ne sais pas si cette méthode sera rapide mais elle sera toujours mieux que readlines()
0
Yofure Messages postés 26 Date d'inscription samedi 18 juillet 2009 Statut Membre Dernière intervention 8 octobre 2011
3 juin 2009 à 20:01
Re-bien le bonjour à tous.
N'ayant pas été forcément très clair dans l'explication de la méthode que j'envisageais, je n'ai pas été forcément compris. Cependant, j'ai pu trouver réponses à mes questions, et mettre debout un programme que voici (plus ou moins commenté) :

# Importation de modules de fonctions et de fonctions :
import os # Fonctions de communication avec le système d'exploitation
import random # Fonction de création d'un nombre aléatoire

# Définition des variables, listes, etc... nécessaires :
liMotsCrees = []


# Indication du répertoire courant (pour l'ouverture de la liste de mots)
rep_cour = os.getcwd()
print "Le répertoire courant est :", rep_cour

# Ouverture de la liste de mots dans une variable
obFichier = open('listeFrancais.txt','r')
listeFrancais = obFichier.read()
obFichier.close()

# Entrée des lettres par l'utilisateur :
l1 = raw_input('Entrez la première lettre : ')
l2 = raw_input('Entrez la deuxième lettre : ')
l3 = raw_input('Entrez la troisième lettre : ')
l4 = raw_input('Entrez la quatrième lettre : ')
l5 = raw_input('Entrez la cinquième lettre : ')
l6 = raw_input('Entrez la sixième lettre : ')
l7 = raw_input('Entrez la septième lettre : ')
l8 = raw_input('Entrez la huitième lettre : ')

# Boucle principale :
while len(liMotsCrees) <= 20160 : # Se fait autant de fois que le nombre combinaisons possibles
nbL1 = random.randint(1, 100)
nbL2 = random.randint(1, 100)
nbL3 = random.randint(1, 100)
nbL4 = random.randint(1, 100)
nbL5 = random.randint(1, 100) # Génération de chiffres aléatoires
nbL6 = random.randint(1, 100)
nbL7 = random.randint(1, 100)
nbL8 = random.randint(1, 100)

#Définition des compteurs et chaînes de lettres nécessaires à la boucle :
compteur1 = 0
compteur2 = 0
motCree = ''
motTeste = ''

while compteur1 <= (100) : # Création des combinaisons

if nbL1 == compteur1 :
motCree += l1
if nbL2 == compteur1 :
motCree += l2
if nbL3 == compteur1 :
motCree += l3
if nbL4 == compteur1 :
motCree += l4
if nbL5 == compteur1 :
motCree += l5
if nbL6 == compteur1 :
motCree += l6
if nbL7 == compteur1 :
motCree += l7
if nbL8 == compteur1 :
motCree += l8

compteur1 += 1

if motCree not in liMotsCrees : # Ajout de la combinaison à la liste des combinaisons déjà faites
liMotsCrees.append(motCree)

while compteur2 < len(listeFrancais) :
if listeFrancais[compteur2] != """
""":
motTeste += listeFrancais[compteur2]
compteur2 += 1

elif listeFrancais[compteur2] == 'a' :
listeFrancais[compteur2] = 'A'
elif listeFrancais[compteur2] == 'b' :
listeFrancais[compteur2] = 'B'
elif listeFrancais[compteur2] == 'c' :
listeFrancais[compteur2] = 'C'
elif listeFrancais[compteur2] == 'd' :
listeFrancais[compteur2] = 'D'
elif listeFrancais[compteur2] == 'e' :
listeFrancais[compteur2] = 'E'
elif listeFrancais[compteur2] == 'f' :
listeFrancais[compteur2] = 'F'
elif listeFrancais[compteur2] == 'g' :
listeFrancais[compteur2] = 'G'
elif listeFrancais[compteur2] == 'h' :
listeFrancais[compteur2] = 'H'
elif listeFrancais[compteur2] == 'i' :
listeFrancais[compteur2] = 'I'
elif listeFrancais[compteur2] == 'j' :
listeFrancais[compteur2] = 'J'
elif listeFrancais[compteur2] == 'k' :
listeFrancais[compteur2] = 'K'
elif listeFrancais[compteur2] == 'l' :
listeFrancais[compteur2] = 'L'
elif listeFrancais[compteur2] == 'm' :
listeFrancais[compteur2] = 'M'
elif listeFrancais[compteur2] == 'n' :
listeFrancais[compteur2] = 'N'
elif listeFrancais[compteur2] == 'o' :
listeFrancais[compteur2] = 'O'
elif listeFrancais[compteur2] == 'p' :
listeFrancais[compteur2] = 'P'
elif listeFrancais[compteur2] == 'q' :
listeFrancais[compteur2] = 'Q'
elif listeFrancais[compteur2] == 'r' :
listeFrancais[compteur2] = 'R'
elif listeFrancais[compteur2] == 's' :
listeFrancais[compteur2] = 'S'
elif listeFrancais[compteur2] == 't' :
listeFrancais[compteur2] = 'T'
elif listeFrancais[compteur2] == 'u' :
listeFrancais[compteur2] = 'U'
elif listeFrancais[compteur2] == 'v' :
listeFrancais[compteur2] = 'V'
elif listeFrancais[compteur2] == 'w' :
listeFrancais[compteur2] = 'W'
elif listeFrancais[compteur2] == 'x' :
listeFrancais[compteur2] = 'X'
elif listeFrancais[compteur2] == 'y' :
listeFrancais[compteur2] = 'Y'
elif listeFrancais[compteur2] == 'z' :
listeFrancais[compteur2] = 'Z'

elif listeFrancais[compteur2] == """
""":
compteur2 += 1
if motCree == motTeste :
print motTeste


Walà... Cepdant, ma méthode est horriblement loin d'être géniale, primo parceque je ne suis pas du tout sûr que le mot recherché soit dans ma liste de mots importée, et surtout secondo parceque ma boucle de 20160 mots fait planter la chose...
Si quelqu'un a une idée plus ingénieuse, donc...
Merci =)
0
Rejoignez-nous