TP python scrabble

Fermé
batghewy Messages postés 2 Date d'inscription dimanche 17 octobre 2021 Statut Membre Dernière intervention 17 octobre 2021 - 17 oct. 2021 à 11:22
yg_be Messages postés 22881 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 juin 2024 - 18 oct. 2021 à 08:00
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 '''

A voir également:

2 réponses

yg_be Messages postés 22881 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 juin 2024 1 475
17 oct. 2021 à 11:38
bonjour,
quel est le soucis avec ton programme?
as-tu une question?
0
batghewy Messages postés 2 Date d'inscription dimanche 17 octobre 2021 Statut Membre Dernière intervention 17 octobre 2021
17 oct. 2021 à 11:49
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
0
yg_be Messages postés 22881 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 juin 2024 1 475
18 oct. 2021 à 08:00
et la fonction se compte comment?
quel est le code de cette fonction?
0