From 28c7c9b38420e654b2cdcc30325689ccc70b533c Mon Sep 17 00:00:00 2001 From: Koffi Gantchou <koffi.gantchou.etu@univ-lille.fr> Date: Wed, 22 Jan 2025 19:04:24 +0100 Subject: [PATCH] Replace tp1.py --- tp1.py | 539 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 269 insertions(+), 270 deletions(-) diff --git a/tp1.py b/tp1.py index 96798db..9fb9c0f 100644 --- a/tp1.py +++ b/tp1.py @@ -1,270 +1,269 @@ -#nom:gantchou koffi -#mi13 -# anagrammes -# 16/01 -#METHODE SPLIT - - -#2 la methode split supprime l'element pris en parametre dans la chaine -# >>> s= "la méthode split est parfois bien utile" -# >>> s.split(' ') -# ['la', 'méthode', 'split', 'est', 'parfois', 'bien', 'utile'] -# >>> s.split('e') -# ['la méthod', ' split ', 'st parfois bi', 'n util', ''] -# >>> s.split('é') -# ['la m', 'thode split est parfois bien utile'] -# >>> s.split() -# ['la', 'méthode', 'split', 'est', 'parfois', 'bien', 'utile'] -# >>> s.split('') -# Traceback (most recent call last): -# File "<stdin>", line 1, in <module> -# ValueError: empty separator -# >>> s.split('split') -# ['la méthode ', ' est parfois bien utile'] - -#3 la methode split ne modifie pas la chaine a laquelle elle s'applique - -#METHODE JOIN -# la methode join ne modifiie pas la chaine a laquelle elle s'applique - - -#la methode sort ne s'applique que sur des listes -# de meme que join - -def join(carac:str,l:list[str])->str: - """ à_remplacer_par_ce_que_fait_la_fonction - - Précondition : - Exemple(s) : - $$$ join('.', ['raymond', 'calbuth', 'ronchin', 'fr']) - 'raymond.calbuth.ronchin.fr' - - """ - res='' - for i in range(len(l)-1): - res+=l[i]+carac - res=res+l[len(l)-1] - - return res - -def sort(s: str) -> str: - """ - Renvoie une chaîne de caractères contenant les caractères de `s` triés dans l'ordre croissant. - - Précondition: aucune - - Exemples: - - $$$ sort('timoleon') - 'eilmnoot' - """ - l=list(s) - l.sort() - v="".join(l) - return v - -def sont_anagrammes(s1: str, s2: str) -> bool: - """ - Renvoie True si s1 et s2 sont anagrammatiques, False sinon. - - Précondition: aucune - - Exemples: - - $$$ sont_anagrammes('orange', 'organe') - True - $$$ sont_anagrammes('orange','Organe') - False - """ - anag1=sort(s1) - anag2=sort(s2) - return anag1==anag2 - -def sont_anagrammes2(s1:str,s2:str)->bool: - """ à_remplacer_par_ce_que_fait_la_fonction - - Précondition : - Exemple(s) : - $$$ sont_anagrammes2('orange', 'organe') - True - $$$ sont_anagrammes2('orange','Organe') - False - - """ - dict1={} - dict2={} - for elt in s1: - if elt in dict1: - dict1[elt]=dict1[elt]+1 - else: - dict1[elt]=1 - - for elm in s2: - if elm in dict2: - dict2[elm]=dict2[elm]+1 - else: - dict2[elm]=1 - return dict1==dict2 - -def sont_anagrammes3(s1:str,s2:str)->bool: - """ à_remplacer_par_ce_que_fait_la_fonction - - Précondition : - Exemple(s) : - $$$ sont_anagrammes3('orange', 'organe') - True - $$$ sont_anagrammes3('orange','Organe') - False - $$$ sont_anagrammes3('hezf','ehzu') - False - """ - for elt in s1: - if s1.count(elt)!=s2.count(elt): - return False - return True - -EQUIV_NON_ACCENTUE = {'é':'e','ê':'e','è':'e','à':'a','û':'u','â':'a','ï':'i'} -def bas_casse_sans_accent (chaine:str)->str: - """ à_remplacer_par_ce_que_fait_la_fonction - - Précondition : - Exemple(s) : - $$$ bas_casse_sans_accent('Orangé') - 'orange' - $$$ bas_casse_sans_accent('ghsêéè') - 'ghseee' - """ - res='' - for elt in chaine: - for accentue in EQUIV_NON_ACCENTUE: - if elt==accentue: - elt=EQUIV_NON_ACCENTUE[accentue] - res+=elt - return res.lower() - -def sont_anagrammes4(s1:str,s2:str)->bool: - """ à_remplacer_par_ce_que_fait_la_fonction - - Précondition : - Exemple(s) : - $$$ sont_anagrammes4('Orangé', 'organE') - True - - """ - a=bas_casse_sans_accent(s1) - b=bas_casse_sans_accent(s2) - if sort(a)!=sort(b): - return False - return True - -# il y'a 139719 mots dans ce lexique -# non ce lexique ne contient pas de doublons car len(LEXIQUE)==len(set(LEXIQUE)) - -from lexique import LEXIQUE -def anagrammes(mot: str) -> list[str]: - """ - Renvoie la liste des mots figurant dans le LEXIQUE qui sont des anagrammes de mot. - - Précondition: aucune - - Exemples: - - $$$ anagrammes('orange') - ['onagre', 'orange', 'orangé', 'organe', 'rongea'] - $$$ anagrammes('info') - ['foin'] - $$$ anagrammes('Calbuth') - [] - """ - res=[] - for elt in LEXIQUE: - - if len(mot) == len(elt) and sont_anagrammes4(elt,mot): - res.append(elt) - return res - -#2 liste des anagrammes du mot chien -# ['chien', 'chiné', 'niche', 'niché'] - - -# ANAGRAMMES D'UN MOT:seconde methode -#1 il n'est pas raisonnable de prendre les mots du lexique pour clés car plusieurs clés ne peuvent pas designer la meme valeur -# en effet ces mots du lexiques en representant les clés auront tous la meme valeur qui est le mot dont on cherche ces anagrammes - - -def cle(chaine:str)->str: - """ à_remplacer_par_ce_que_fait_la_fonction - - Précondition : - Exemple(s) : - $$$ cle('Orangé') - 'aegnor' - - """ - a=bas_casse_sans_accent(chaine) - b=sort(a) - return b - - - - -ANAGRAMMES={} -for mot in LEXIQUE: - if not(mot in ANAGRAMMES): - mot_anagrammes = anagrammes(mot) - for elt in mot_anagrammes: - ANAGRAMMES[elt] = mot_anagrammes - - - -def anagrammes2(mot:str)->list[str]: - """ à_remplacer_par_ce_que_fait_la_fonction - - Précondition : - Exemple(s) : - $$$ - """ - return ANAGRAMMES.get(mot,[mot]) - - - -#c'est la methode avec le dictionnaire la plus rapide -i=0 -ANAGRAMMES2={} -for mote in LEXIQUE: - i+=1 - if not(mote in ANAGRAMMES2): - mot_anagrammes2 = anagrammes(mote) - for elm in mot_anagrammes2: - ANAGRAMMES2[elm] = mot_anagrammes2 - if i==30: - break - - -def anagrammes3(mot:str)->list[str]: - """ à_remplacer_par_ce_que_fait_la_fonction - - Précondition : - Exemple(s) : - $$$ anagrammes3('chien') - ['chien', 'chiné', 'niche', 'niché'] - """ - return ANAGRAMMES2.get(mot,[mot]) - - -def anagrammes_phrase(phrase:str)->list[str]: - """ à_remplacer_par_ce_que_fait_la_fonction - - Précondition : - Exemple(s) : - $$$ - """ - res=[] - mot=[] - liste=phrase.split(' ') - for elt in liste: - mot.append(anagrammes(elt)) - " ".join() - res+=mot - return res - +#nom:gantchou koffi +#mi13 +# anagrammes +# 16/01 +#METHODE SPLIT + + +#2 la methode split supprime l'element pris en parametre dans la chaine +# >>> s= "la méthode split est parfois bien utile" +# >>> s.split(' ') +# ['la', 'méthode', 'split', 'est', 'parfois', 'bien', 'utile'] +# >>> s.split('e') +# ['la méthod', ' split ', 'st parfois bi', 'n util', ''] +# >>> s.split('é') +# ['la m', 'thode split est parfois bien utile'] +# >>> s.split() +# ['la', 'méthode', 'split', 'est', 'parfois', 'bien', 'utile'] +# >>> s.split('') +# Traceback (most recent call last): +# File "<stdin>", line 1, in <module> +# ValueError: empty separator +# >>> s.split('split') +# ['la méthode ', ' est parfois bien utile'] + +#3 la methode split ne modifie pas la chaine a laquelle elle s'applique + +#METHODE JOIN +# la methode join ne modifiie pas la chaine a laquelle elle s'applique + + +#la methode sort ne s'applique que sur des listes +# de meme que join + +def join(carac:str,l:list[str])->str: + """ à_remplacer_par_ce_que_fait_la_fonction + + Précondition : + Exemple(s) : + $$$ join('.', ['raymond', 'calbuth', 'ronchin', 'fr']) + 'raymond.calbuth.ronchin.fr' + + """ + res='' + for i in range(len(l)-1): + res+=l[i]+carac + res=res+l[len(l)-1] + + return res + +def sort(s: str) -> str: + """ + Renvoie une chaîne de caractères contenant les caractères de `s` triés dans l'ordre croissant. + + Précondition: aucune + + Exemples: + + $$$ sort('timoleon') + 'eilmnoot' + """ + l=list(s) + l.sort() + v="".join(l) + return v + +def sont_anagrammes(s1: str, s2: str) -> bool: + """ + Renvoie True si s1 et s2 sont anagrammatiques, False sinon. + + Précondition: aucune + + Exemples: + + $$$ sont_anagrammes('orange', 'organe') + True + $$$ sont_anagrammes('orange','Organe') + False + """ + anag1=sort(s1) + anag2=sort(s2) + return anag1==anag2 + +def sont_anagrammes2(s1:str,s2:str)->bool: + """ à_remplacer_par_ce_que_fait_la_fonction + + Précondition : + Exemple(s) : + $$$ sont_anagrammes2('orange', 'organe') + True + $$$ sont_anagrammes2('orange','Organe') + False + + """ + dict1={} + dict2={} + for elt in s1: + if elt in dict1: + dict1[elt]=dict1[elt]+1 + else: + dict1[elt]=1 + + for elm in s2: + if elm in dict2: + dict2[elm]=dict2[elm]+1 + else: + dict2[elm]=1 + return dict1==dict2 + +def sont_anagrammes3(s1:str,s2:str)->bool: + """ à_remplacer_par_ce_que_fait_la_fonction + + Précondition : + Exemple(s) : + $$$ sont_anagrammes3('orange', 'organe') + True + $$$ sont_anagrammes3('orange','Organe') + False + $$$ sont_anagrammes3('hezf','ehzu') + False + """ + for elt in s1: + if s1.count(elt)!=s2.count(elt): + return False + return True + +EQUIV_NON_ACCENTUE = { + 'à': 'a', 'á': 'a', 'â': 'a', 'ã': 'a', 'ä': 'a', 'å': 'a', + 'ç': 'c', + 'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e', + 'ì': 'i', 'í': 'i', 'î': 'i', 'ï': 'i', + 'ñ': 'n', + 'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ': 'o', 'ö': 'o', + 'ù': 'u', 'ú': 'u', 'û': 'u', 'ü': 'u', + 'ý': 'y', 'ÿ': 'y' +} +def bas_casse_sans_accent (chaine:str)->str: + """ à_remplacer_par_ce_que_fait_la_fonction + + Précondition : + Exemple(s) : + $$$ bas_casse_sans_accent('Orangé') + 'orange' + $$$ bas_casse_sans_accent('ghsêéè') + 'ghseee' + """ + res='' + for elt in chaine: + for accentue in EQUIV_NON_ACCENTUE: + if elt==accentue: + elt=EQUIV_NON_ACCENTUE[accentue] + res+=elt + return res.lower() + +def sont_anagrammes4(s1:str,s2:str)->bool: + """ à_remplacer_par_ce_que_fait_la_fonction + + Précondition : + Exemple(s) : + $$$ sont_anagrammes4('Orangé', 'organE') + True + + """ + a=bas_casse_sans_accent(s1) + b=bas_casse_sans_accent(s2) + if sort(a)!=sort(b): + return False + return True + +# il y'a 139719 mots dans ce lexique +# non ce lexique ne contient pas de doublons car len(LEXIQUE)==len(set(LEXIQUE)) + +from lexique import LEXIQUE +def anagrammes(mot: str) -> list[str]: + """ + Renvoie la liste des mots figurant dans le LEXIQUE qui sont des anagrammes de mot. + + Précondition: aucune + + Exemples: + + $$$ anagrammes('orange') + ['onagre', 'orange', 'orangé', 'organe', 'rongea'] + $$$ anagrammes('info') + ['foin'] + $$$ anagrammes('Calbuth') + [] + """ + res=[] + for elt in LEXIQUE: + + if len(mot) == len(elt) and sont_anagrammes4(elt,mot): + res.append(elt) + return res + +#2 liste des anagrammes du mot chien +# ['chien', 'chiné', 'niche', 'niché'] + + +# ANAGRAMMES D'UN MOT:seconde methode +#1 il n'est pas raisonnable de prendre les mots du lexique pour clés car plusieurs clés ne peuvent pas designer la meme valeur +# en effet ces mots du lexiques en representant les clés auront tous la meme valeur qui est le mot dont on cherche ces anagrammes + + +def cle(chaine:str)->str: + """ à_remplacer_par_ce_que_fait_la_fonction + + Précondition : + Exemple(s) : + $$$ cle('Orangé') + 'aegnor' + + """ + a=bas_casse_sans_accent(chaine) + b=sort(a) + return b + +ANAGRAMMES={} +for mot in LEXIQUE: + mot_cle=cle(mot) + if mot_cle not in ANAGRAMMES: + ANAGRAMMES[mot_cle]=[] + ANAGRAMMES[mot_cle].append(mot) +print(len(ANAGRAMMES)) + + +def anagrammes2(mot:str)->list[str]: + """ à_remplacer_par_ce_que_fait_la_fonction + + Précondition : + Exemple(s) : + $$$ + """ + return ANAGRAMMES[cle(mot)] + + +#c'est la methode avec le dictionnaire la plus rapide + +i=0 +ANAGRAMMES2={} +for mot in LEXIQUE: + i+=1 + mot_cle=cle(mot) + if mot_cle not in ANAGRAMMES2: + ANAGRAMMES2[mot_cle]=[] + ANAGRAMMES2[mot_cle].append(mot) + if i==30: + break + + +# on a 27 comme longeur au lieu de 30 car il y'a certains mots qui se repetent comme a et à etc +def anagrammes_phrase(phrase:str)->list[str]: + """ à_remplacer_par_ce_que_fait_la_fonction + + Précondition : + Exemple(s) : + $$$ + """ + res=[] + mot='' + resultat=[] + liste=phrase.split() + for elt in liste: + res.append(anagrammes2(elt)) + for i in range(len(res)): + for j in range(len(res)-1): + mot += res[i-1][j-1] + res[j-1][i-1] + resultat.append(mot) + return resultat + -- GitLab