Bonjour,
j'ai un Tp sur python à faire, j'ai réussi toutes les questions sauf erreur de ma part, il me manque juste la dernière question où je suis bloqué depuis un moment. La dernière question porte sur le scrabble, je vous met mon programme et le sujet en pièce jointe, si quelqu'un peut m'aider, ça serait cool.
# -*- coding: utf-8 -*-
"""
Created on Thu Oct 14 12:50:05 2021
@author: Utilisateur
"""
def dictionnaire(fichier):
"""
renvoie la liste de tous les mots contenus dans le fichier dont le nom est passé en argument
argument : fichier, de type chaine de caractères. C'est le nom du fichier compressé contenant le dictionnaire
résultat : de type liste de chaines de caractères. Chaque élément de la liste correspond à une ligne du fichier"""
import zipfile
import sys
f = zipfile.ZipFile(fichier, 'r')
l = f.namelist()
if len(l) != 1:
print("*** L'archive devrait contenir exactement 1 fichier mais en contient {}".format(len(l)))
sys.exit(1)
r = f.read(l[0]).decode(encoding="UTF-8", errors="strict").split("\n")
return [m for m in r if len(m) != 0]
# Question 1
# len(littre) renvoi 73192, donc il y a 73192 mots dans le dictionnaire littre.zip
# len(dicoConjug) renvoi 336531, donc il y a 336531 mots dans le dictionnaire dicoConjug.zip
# pour obtenir c'est valeur, on rentre dans la console len(littre) et len(dicoConjug) après avoir rentré dans la console littre = dictionnaire("littre.zip") et littre = dictionnaire("littre.zip")
littre = dictionnaire("littre.zip")
dicoConjug = dictionnaire("dicoConjug.zip")
# Question 2
def mots_de_n_lettres(dico,n):
return [m for m in dico if len(m)==n]
"""TEST OK
mots_de_n_lettres(littre,22)
Out[12]: ['cristallographiquement', 'disproportionnellement']
len(mots_de_n_lettres(dicoConjug,10))
Out[13]: 51402"""
# 51402 mots de 10 lettres dans dicoConjug et 2 mot de 22 lettres dans le littre.
#question 3
def mot_commence_par(mot,prefixe):
b=len(prefixe)
if prefixe[0:b]==mot[0:b]:
return True
else :
return False
"""TEST OK
mot_commence_par("temoignage","te")
Out[14]: True
mot_commence_par("chouette", "choux")
Out[15]: False
mot_commence_par("chouette", "clou")
Out[16]: False
mot_commence_par("chou", "chouette")
Out[17]: False
mot_commence_par("chouette", "chou")
Out[18]: True"""
#question 4
def liste_mots_commencant_par(dico,prefixe):
return [m for m in dico if mot_commence_par(m,prefixe)]
"""TEST OK
liste_mots_commencant_par(littre,'chou')
Out[19]:
['chou',
'chouan',
'chouanisme',
'chouanner',
'chouannerie',
'chouart',
'chouc',
'choucas',
'chouchement',
'chouchette',
'choucroute',
'choudet',
'choue',
'chouette',
'chouler',
'chouquet',
'chouquette']
len(liste_mots_commencant_par(littre,'chou'))
Out[20]: 17"""
#17 mots commencant par chou dans le littre
#question 5
def envers (mot) :
res=""
for lettre in mot:
res=lettre+res
return res
def mot_termine_par(mot,suffixe):
a=envers(mot)
b=len(suffixe)
c=envers(suffixe)
if c[0:b]==a[0:b]:
return True
else:
return False
def liste_mots_terminant_par(dico,suffixe):
return [m for m in dico if mot_termine_par(m,suffixe)]
""" fonction envers qui renvoi l'inverse d'un mot que je réutilise dans ma deuxième fonction.
TEST OK
envers('chat')
Out[24]: 'tahc'
mot_termine_par('chat','at')
Out[25]: True
mot_termine_par('chat','ta')
Out[26]: False
mot_termine_par('chaleureux','cha')
Out[27]: False
liste_mots_terminant_par(littre,'chou')
Out[28]: ['bachou', 'cachou', 'chabichou', 'chou']"""
#question 6
def mots_debut_fin_n(dico,prefixe,suffixe,n):
a=mots_de_n_lettres(dico,n)
b=liste_mots_commencant_par(a,prefixe)
c=liste_mots_terminant_par(b,suffixe)
return c
""" TEST OK
mots_debut_fin_n(dicoConjug,'cas','ns',12)
Out[29]:
['cascaderions',
'caséfierions',
'casematerons',
'casernerions',
'casquassions',
'castagnerons',
'castrassions']
len(mots_debut_fin_n(dicoConjug,'cas','ns',12))
Out[30]: 7"""
#7 mots commençant par "cas", se terminant par "ns" et comportant 12 lettres dans le dictionnaire avec conjugaisons
#question 7
def mot_correspond(mot, motif):
if len(mot)!=len(motif):
return False
else :
res=0
for i in range (0,len(mot)):
if mot[i]==motif[i] or motif[i]==".":
res=res+1
if res==len(mot):
return True
else :
return False
"""TEST OK
mot_correspond("tarte", "t..t.")
Out[31]: True
mot_correspond("tarte", "t..")
Out[32]: False
mot_correspond("cheval", "c..v..l")
Out[33]: False
mot_correspond("cheval", "c..v.l")
Out[34]: True
mot_correspond("cheval", "c..v.r")
Out[35]: False
mot_correspond("cheval", "c..o.l")
Out[36]: False"""
#question 8
def liste_mots_motif(dico,motif):
return [m for m in dico if mot_correspond(m, motif)]
"""TEST OK
liste_mots_motif(dicoConjug,'p..h.s')
Out[37]:
['pachas',
'pathos',
'péchas',
'pêchas',
'péchés',
'pèches',
'pêches',
'pêchés',
'pochas',
'poches',
'pochés',
'puches']
len(liste_mots_motif(dicoConjug,'p..h.s'))
Out[38]: 12"""
# 12 mots correspondant au motif "p..h.s" dans le dictionnaire avec conjugaisons.
#question 9 (Bonus)
def mot_correspond2(mot,motif):
if len(mot)!=len(motif):
return False
else :
tab=['à','ä','â','ç','ê','è','é','ë','î','ï','ô','ö','ù','ü','û']
res=0
for i in range (0,len(mot)):
if mot[i]==motif[i] or motif[i]=='.' or mot[i] in tab:
res=res+1
if res==len(mot):
return True
else:
return False
"""TEST OK
mot_correspond2("pêches", ".ech..")
Out[41]: True
mot_correspond2("bâteau", ".a.e.u")
Out[42]: True
mot_correspond2('pêche','p..c..')
Out[43]: False"""
#question 10
def apparait(lettre,mot):
res=0
for i in range (0,len(mot)):
if mot[i]==lettre:
res=res+1
if res>0:
return True
else:
return False
"""TEST OK
apparait('l','lapin')
Out[44]: True
apparait('o','lapin')
Out[45]: False """
def mot_possible(mot,lettres):
result=True
for a in mot:
if not(a in lettres):
result=False
return result
#pas la peine d'utilisé apparaît, ca rallonge le programme
"""TEST OK
mot_possible("lapin", "abilnpq")
Out[48]: True
mot_possible("cheval", "abilnpq")
Out[49]: False
mot_possible("chapeau", "abcehpuv")
Out[50]: True
mot_possible('transcendantalement','abondance')
Out[27]: False"""
#question 11
def mot_optimal(dico, lettres):
mot=""
for m in dico:
if mot_possible(m,lettres) and len(m)>len(mot):
mot=m
return mot
'''TEST OK
mot_optimal(littre, 'abondance')
Out[30]: 'abondance'
mot_optimal(littre, 'abcddefghijklmnopqrstuvwxyz')
Out[31]: 'inconstitutionnellement'
'''
#question 12
def apparait2(lettre,mot):
res=0
for i in range (0,len(mot)):
if mot[i]==lettre:
res=res+1
return res
# fonction comptant le nombre d'apparition de la lettre dans le mot
'''TEST OK
apparait2('a','chapeau')
Out[34]: 2
apparait2('o','tobinambourou')
Out[35]: 3 '''
bonjour, le soucis est sur la dernière question de l'énoncé (questions 12), j'ai créer une fonction apparait deux qui retourne le nombre de fois qu'une lettre apparait dans un mot, cependant, je n'arrive pas a l'utiliser correctement dans la fonction mots_possible_scrabbel, je voudrais que la fonction return True si le mot est possible avec les lettres passées en paramètres (mais que lorsque l'on utilise une des lettres, on ne peut pas la réutiliser ) ou False