def is_palindrome(w): return w == w[::-1]
is_palindrome('able was I ere I saw elba')
True
b) Si on suppose comme dans l'énoncé que la chaîne n'utilise que des lettres non accentuées, l'ensemble (set
)
de ses lettres, une fois converites en minuscules (ou en majuscules) devra avoir exactement 26 éléments.
Un ensemble (set) c'est un dictionnaire dont les clés n'ont pas de valeur
def is_pangram(w): return len({x.lower() for x in w if x.isalpha()}) == 26
is_pangram('Monsieur Jack, vous dactylographiez bien mieux que votre ami Wolf')
True
c) Pensez à ce que vous feriez avec un paquet de cartes et écrivez le entre []
Noter l'astuce (optionnelle) avec and
pour traiter la liste vide
def remove_adjacent(ll): return ll and [ll[i] for i in range(len(ll)-1) if ll[i+1]!=ll[i] ]+[ll[-1]]
remove_adjacent([1,1,3,3,5,4,2,1,3,3,1,2,1,1])
[1, 3, 5, 4, 2, 1, 3, 1, 2, 1]
# autre version
def remove_adjacent(ll): return ll and [ll[i] for i in range(len(ll)) if i==0 or ll[i-1]!=ll[i] ]
remove_adjacent([1,1,3,3,5,4,2,1,3,3,1,2,1,1])
[1, 3, 5, 4, 2, 1, 3, 1, 2, 1]
d) Remarquer les fonctions de conversion.
def digits_sum(n): return sum([int(c) for c in str(n)])
digits_sum(2**100)
115
En Python 3, les chaînes sont en unicode. maketrans
devient une méthode de la classe str
.
open
prend un deuxième argument, encoding.
On écrit une fonction ok(w)
qui teste si une ligne ne contient que les caractères autorisés (et le \n
)
une fois qu'on a traduit les caracères accentués.
On lit le dictionnaire (décodé) sous forme d'une liste de lignes, et on le filtre avec ok
.
On peut ensuite imprimer le mot original, sa version majuscules sans accents, et sa traduction en chiffres.
# Exercice 2, version avec des ensembles
# (on pouvait aussi utiliser un expression régulière)
# On se débarasse des lettres accentuées (le dictionnaire est en iso-8859, alias latin1)
aa ='àâäéèêëîïôöùûüç'
bb ='aaaeeeeiioouuuc'
t1 = str.maketrans(aa,bb)
ll= open('liste.de.mots.francais.frgut.txt', encoding='latin1').readlines()
def ok(w):
return set(w.translate(t1)).issubset(set('ioeshbdlzg\n'))
mm=[x for x in ll if ok(x)]
print ("nombre de mots : ", len(mm))
t2 = str.maketrans('IOESHBDLZG', '1035480729')
for x in mm:
y = x[:-1].translate(t1);
print (x[:-1], y.upper(), y.upper()[::-1].translate(t2))
nombre de mots : 837 bébé BEBE 3838 bébés BEBES 53838 bée BEE 338 bées BEES 5338 béez BEEZ 2338 béiez BEIEZ 23138 beige BEIGE 39138 beiges BEIGES 539138 bel BEL 738 bêle BELE 3738 bêlé BELE 3738 bêlée BELEE 33738 bêlées BELEES 533738 bêles BELES 53738 bêlés BELES 53738 bêlez BELEZ 23738 belge BELGE 39738 belges BELGES 539738 bêliez BELIEZ 231738 belle BELLE 37738 belles BELLES 537738 bibi BIBI 1818 bibis BIBIS 51818 bible BIBLE 37818 bibles BIBLES 537818 bide BIDE 3018 bides BIDES 53018 bielle BIELLE 377318 bielles BIELLES 5377318 bigle BIGLE 37918 biglé BIGLE 37918 biglée BIGLEE 337918 biglées BIGLEES 5337918 bigles BIGLES 537918 biglés BIGLES 537918 biglez BIGLEZ 237918 bigliez BIGLIEZ 2317918 bile BILE 3718 bilé BILE 3718 bilée BILEE 33718 bilées BILEES 533718 biles BILES 53718 bilés BILES 53718 bilez BILEZ 23718 biliez BILIEZ 231718 bill BILL 7718 bille BILLE 37718 billes BILLES 537718 bills BILLS 57718 bilobé BILOBE 380718 bilobée BILOBEE 3380718 bilobées BILOBEES 53380718 bilobés BILOBES 5380718 biologie BIOLOGIE 31907018 biologies BIOLOGIES 531907018 bis BIS 518 bisbille BISBILLE 37718518 bisbilles BISBILLES 537718518 bise BISE 3518 bisé BISE 3518 bisée BISEE 33518 bisées BISEES 533518 bises BISES 53518 bisés BISES 53518 bisez BISEZ 23518 bisiez BISIEZ 231518 bisse BISSE 35518 bissé BISSE 35518 bissée BISSEE 335518 bissées BISSEES 5335518 bisses BISSES 535518 bissés BISSES 535518 bissez BISSEZ 235518 bissiez BISSIEZ 2315518 blé BLE 378 bled BLED 0378 bleds BLEDS 50378 blés BLES 5378 blésé BLESE 35378 blèse BLESE 35378 blésée BLESEE 335378 blésées BLESEES 5335378 blésés BLESES 535378 blèses BLESES 535378 blésez BLESEZ 235378 blésiez BLESIEZ 2315378 blesse BLESSE 355378 blessé BLESSE 355378 blessée BLESSEE 3355378 blessées BLESSEES 53355378 blesses BLESSES 5355378 blessés BLESSES 5355378 blessez BLESSEZ 2355378 blessiez BLESSIEZ 23155378 bob BOB 808 bobo BOBO 0808 bobos BOBOS 50808 bobs BOBS 5808 bobsleigh BOBSLEIGH 491375808 bobsleighs BOBSLEIGHS 5491375808 boësse BOESSE 355308 boësses BOESSES 5355308 boghei BOGHEI 134908 bogheis BOGHEIS 5134908 bogie BOGIE 31908 bogies BOGIES 531908 boille BOILLE 377108 boilles BOILLES 5377108 bois BOIS 5108 boise BOISE 35108 boisé BOISE 35108 boisée BOISEE 335108 boisées BOISEES 5335108 boises BOISES 535108 boisés BOISES 535108 boisez BOISEZ 235108 boisiez BOISIEZ 2315108 bol BOL 708 boldo BOLDO 00708 boldos BOLDOS 500708 bolée BOLEE 33708 bolées BOLEES 533708 bolide BOLIDE 301708 bolides BOLIDES 5301708 bols BOLS 5708 boss BOSS 5508 bosse BOSSE 35508 bossé BOSSE 35508 bossée BOSSEE 335508 bossées BOSSEES 5335508 bosselé BOSSELE 3735508 bosselée BOSSELEE 33735508 bosselées BOSSELEES 533735508 bosselés BOSSELES 53735508 bosselez BOSSELEZ 23735508 bosseliez BOSSELIEZ 231735508 bosselle BOSSELLE 37735508 bosselles BOSSELLES 537735508 bosses BOSSES 535508 bossés BOSSES 535508 bossez BOSSEZ 235508 bossiez BOSSIEZ 2315508 de DE 30 dé DE 30 débile DEBILE 371830 débiles DEBILES 5371830 déboise DEBOISE 3510830 déboisé DEBOISE 3510830 déboisée DEBOISEE 33510830 déboisées DEBOISEES 533510830 déboises DEBOISES 53510830 déboisés DEBOISES 53510830 déboisez DEBOISEZ 23510830 déboisiez DEBOISIEZ 231510830 débosselé DEBOSSELE 373550830 débosselée DEBOSSELEE 3373550830 débosselées DEBOSSELEES 53373550830 débosselés DEBOSSELES 5373550830 débosselez DEBOSSELEZ 2373550830 débosseliez DEBOSSELIEZ 23173550830 débosselle DEBOSSELLE 3773550830 débosselles DEBOSSELLES 53773550830 dédie DEDIE 31030 dédié DEDIE 31030 dédiée DEDIEE 331030 dédiées DEDIEES 5331030 dédies DEDIES 531030 dédiés DEDIES 531030 dédiez DEDIEZ 231030 dédiiez DEDIIEZ 2311030 dédis DEDIS 51030 dédise DEDISE 351030 dédises DEDISES 5351030 dédisiez DEDISIEZ 23151030 dédisse DEDISSE 3551030 dédisses DEDISSES 53551030 dédissiez DEDISSIEZ 231551030 déesse DEESSE 355330 déesses DEESSES 5355330 dégel DEGEL 73930 dégelé DEGELE 373930 dégèle DEGELE 373930 dégelée DEGELEE 3373930 dégelées DEGELEES 53373930 dégelés DEGELES 5373930 dégèles DEGELES 5373930 dégelez DEGELEZ 2373930 dégeliez DEGELIEZ 23173930 dégels DEGELS 573930 dégobille DEGOBILLE 377180930 dégobillé DEGOBILLE 377180930 dégobillée DEGOBILLEE 3377180930 dégobillées DEGOBILLEES 53377180930 dégobilles DEGOBILLES 5377180930 dégobillés DEGOBILLES 5377180930 dégobillez DEGOBILLEZ 2377180930 dégobilliez DEGOBILLIEZ 23177180930 dégoise DEGOISE 3510930 dégoisé DEGOISE 3510930 dégoisée DEGOISEE 33510930 dégoisées DEGOISEES 533510930 dégoises DEGOISES 53510930 dégoisés DEGOISES 53510930 dégoisez DEGOISEZ 23510930 dégoisiez DEGOISIEZ 231510930 délébile DELEBILE 37183730 délébiles DELEBILES 537183730 délie DELIE 31730 délié DELIE 31730 déliée DELIEE 331730 déliées DELIEES 5331730 délies DELIES 531730 déliés DELIES 531730 déliez DELIEZ 231730 déliiez DELIIEZ 2311730 délisse DELISSE 3551730 délissé DELISSE 3551730 délissée DELISSEE 33551730 délissées DELISSEES 533551730 délisses DELISSES 53551730 délissés DELISSES 53551730 délissez DELISSEZ 23551730 délissiez DELISSIEZ 231551730 déloge DELOGE 390730 délogé DELOGE 390730 délogée DELOGEE 3390730 délogées DELOGEES 53390730 déloges DELOGES 5390730 délogés DELOGES 5390730 délogez DELOGEZ 2390730 délogiez DELOGIEZ 23190730 des DES 530 dés DES 530 dès DES 530 désobéi DESOBEI 1380530 désobéie DESOBEIE 31380530 désobéies DESOBEIES 531380530 désobéis DESOBEIS 51380530 désobéisse DESOBEISSE 3551380530 désobéisses DESOBEISSES 53551380530 désobéissez DESOBEISSEZ 23551380530 désobéissiez DESOBEISSIEZ 231551380530 désoblige DESOBLIGE 391780530 désobligé DESOBLIGE 391780530 désobligée DESOBLIGEE 3391780530 désobligées DESOBLIGEES 53391780530 désobliges DESOBLIGES 5391780530 désobligés DESOBLIGES 5391780530 désobligez DESOBLIGEZ 2391780530 désobligiez DESOBLIGIEZ 23191780530 désole DESOLE 370530 désolé DESOLE 370530 désolée DESOLEE 3370530 désolées DESOLEES 53370530 désoles DESOLES 5370530 désolés DESOLES 5370530 désolez DESOLEZ 2370530 désoliez DESOLIEZ 23170530 désosse DESOSSE 3550530 désossé DESOSSE 3550530 désossée DESOSSEE 33550530 désossées DESOSSEES 533550530 désosses DESOSSES 53550530 désossés DESOSSES 53550530 désossez DESOSSEZ 23550530 désossiez DESOSSIEZ 231550530 desselle DESSELLE 37735530 dessellé DESSELLE 37735530 dessellée DESSELLEE 337735530 dessellées DESSELLEES 5337735530 desselles DESSELLES 537735530 dessellés DESSELLES 537735530 dessellez DESSELLEZ 237735530 desselliez DESSELLIEZ 2317735530 dessille DESSILLE 37715530 dessillé DESSILLE 37715530 dessillée DESSILLEE 337715530 dessillées DESSILLEES 5337715530 dessilles DESSILLES 537715530 dessillés DESSILLES 537715530 dessillez DESSILLEZ 237715530 dessilliez DESSILLIEZ 2317715530 dessole DESSOLE 3705530 dessolé DESSOLE 3705530 dessolée DESSOLEE 33705530 dessolées DESSOLEES 533705530 dessoles DESSOLES 53705530 dessolés DESSOLES 53705530 dessolez DESSOLEZ 23705530 dessoliez DESSOLIEZ 231705530 dg DG 90 dièse DIESE 35310 diesel DIESEL 735310 diesels DIESELS 5735310 dièses DIESES 535310 diode DIODE 30010 diodes DIODES 530010 dis DIS 510 dise DISE 3510 dises DISES 53510 disiez DISIEZ 231510 disse DISSE 35510 disses DISSES 535510 dissiez DISSIEZ 2315510 dl DL 70 do DO 00 dodo DODO 0000 dodos DODOS 50000 doge DOGE 3900 doges DOGES 53900 dois DOIS 5100 dol DOL 700 dole DOLE 3700 dolé DOLE 3700 dolée DOLEE 33700 dolées DOLEES 533700 doles DOLES 53700 dolés DOLES 53700 dolez DOLEZ 23700 doliez DOLIEZ 231700 dols DOLS 5700 dos DOS 500 dose DOSE 3500 dosé DOSE 3500 dosée DOSEE 33500 dosées DOSEES 533500 doses DOSES 53500 dosés DOSES 53500 dosez DOSEZ 23500 dosiez DOSIEZ 231500 dosse DOSSE 35500 dosses DOSSES 535500 ébiselé EBISELE 3735183 ébisèle EBISELE 3735183 ébiselée EBISELEE 33735183 ébiselées EBISELEES 533735183 ébiselés EBISELES 53735183 ébisèles EBISELES 53735183 ébiselez EBISELEZ 23735183 ébiseliez EBISELIEZ 231735183 ébosse EBOSSE 355083 ébossé EBOSSE 355083 ébossée EBOSSEE 3355083 ébossées EBOSSEES 53355083 ébosses EBOSSES 5355083 ébossés EBOSSES 5355083 ébossez EBOSSEZ 2355083 ébossiez EBOSSIEZ 23155083 édile EDILE 37103 édiles EDILES 537103 égide EGIDE 30193 égides EGIDES 530193 église EGLISE 351793 églises EGLISES 5351793 ego EGO 093 égosillé EGOSILLE 37715093 égosillée EGOSILLEE 337715093 égosillées EGOSILLEES 5337715093 égosillés EGOSILLES 537715093 égosillez EGOSILLEZ 237715093 égosilliez EGOSILLIEZ 2317715093 eh EH 43 élégi ELEGI 19373 élégie ELEGIE 319373 élégies ELEGIES 5319373 élégis ELEGIS 519373 élégissez ELEGISSEZ 235519373 élégissiez ELEGISSIEZ 2315519373 éléis ELEIS 51373 élide ELIDE 30173 élidé ELIDE 30173 élidée ELIDEE 330173 élidées ELIDEES 5330173 élides ELIDES 530173 élidés ELIDES 530173 élidez ELIDEZ 230173 élidiez ELIDIEZ 2310173 éligible ELIGIBLE 37819173 éligibles ELIGIBLES 537819173 élis ELIS 5173 élise ELISE 35173 élises ELISES 535173 élisez ELISEZ 235173 élisiez ELISIEZ 2315173 elle ELLE 3773 elles ELLES 53773 élodée ELODEE 330073 élodées ELODEES 5330073 éloge ELOGE 39073 éloges ELOGES 539073 es ES 53 ès ES 53 esse ESSE 3553 esses ESSES 53553 gel GEL 739 gelé GELE 3739 gèle GELE 3739 gelée GELEE 33739 gelées GELEES 533739 gelés GELES 53739 gèles GELES 53739 gelez GELEZ 23739 geliez GELIEZ 231739 gélose GELOSE 350739 géloses GELOSES 5350739 gels GELS 5739 géode GEODE 30039 géodes GEODES 530039 géodésie GEODESIE 31530039 géodésies GEODESIES 531530039 géoïde GEOIDE 301039 géoïdes GEOIDES 5301039 geôle GEOLE 37039 geôles GEOLES 537039 géologie GEOLOGIE 31907039 géologies GEOLOGIES 531907039 gesse GESSE 35539 gesses GESSES 535539 ghilde GHILDE 307149 ghildes GHILDES 5307149 giboie GIBOIE 310819 giboies GIBOIES 5310819 gigolo GIGOLO 070919 gigolos GIGOLOS 5070919 gilde GILDE 30719 gildes GILDES 530719 gille GILLE 37719 gilles GILLES 537719 gis GIS 519 gisez GISEZ 23519 gisiez GISIEZ 231519 glèbe GLEBE 38379 glèbes GLEBES 538379 glisse GLISSE 355179 glissé GLISSE 355179 glissée GLISSEE 3355179 glissées GLISSEES 53355179 glisses GLISSES 5355179 glissés GLISSES 5355179 glissez GLISSEZ 2355179 glissiez GLISSIEZ 23155179 globe GLOBE 38079 globes GLOBES 538079 glose GLOSE 35079 glosé GLOSE 35079 glosée GLOSEE 335079 glosées GLOSEES 5335079 gloses GLOSES 535079 glosés GLOSES 535079 glosez GLOSEZ 235079 glosiez GLOSIEZ 2315079 go GO 09 gobe GOBE 3809 gobé GOBE 3809 gobée GOBEE 33809 gobées GOBEES 533809 gobes GOBES 53809 gobés GOBES 53809 gobez GOBEZ 23809 gobie GOBIE 31809 gobies GOBIES 531809 gobiez GOBIEZ 231809 gode GODE 3009 godé GODE 3009 godes GODES 53009 godez GODEZ 23009 godiez GODIEZ 231009 godille GODILLE 3771009 godillé GODILLE 3771009 godilles GODILLES 53771009 godillez GODILLEZ 23771009 godilliez GODILLIEZ 231771009 gogo GOGO 0909 gogos GOGOS 50909 goï GOI 109 gosse GOSSE 35509 gosses GOSSES 535509 hé HE 34 hélé HELE 3734 hèle HELE 3734 hélée HELEE 33734 hélées HELEES 533734 hélés HELES 53734 hèles HELES 53734 hélez HELEZ 23734 héliez HELIEZ 231734 hello HELLO 07734 hélodée HELODEE 3300734 hélodées HELODEES 53300734 hi HI 14 hie HIE 314 hièble HIEBLE 378314 hièbles HIEBLES 5378314 hies HIES 5314 hisse HISSE 35514 hissé HISSE 35514 hissée HISSEE 335514 hissées HISSEES 5335514 hisses HISSES 535514 hissés HISSES 535514 hissez HISSEZ 235514 hissiez HISSIEZ 2315514 ho HO 04 hobbies HOBBIES 5318804 holoside HOLOSIDE 30150704 holosides HOLOSIDES 530150704 ibis IBIS 5181 ide IDE 301 idée IDEE 3301 idéel IDEEL 73301 idéelle IDEELLE 3773301 idéelles IDEELLES 53773301 idéels IDEELS 573301 idées IDEES 53301 idéologie IDEOLOGIE 319070301 idéologies IDEOLOGIES 5319070301 idéologise IDEOLOGISE 3519070301 idéologisé IDEOLOGISE 3519070301 idéologisée IDEOLOGISEE 33519070301 idéologisées IDEOLOGISEES 533519070301 idéologises IDEOLOGISES 53519070301 idéologisés IDEOLOGISES 53519070301 idéologisez IDEOLOGISEZ 23519070301 idéologisiez IDEOLOGISIEZ 231519070301 ides IDES 5301 idole IDOLE 37001 idoles IDOLES 537001 igloo IGLOO 00791 igloos IGLOOS 500791 il IL 71 île ILE 371 îles ILES 5371 illisible ILLISIBLE 378151771 illisibles ILLISIBLES 5378151771 ils ILS 571 iode IODE 3001 iodé IODE 3001 iodée IODEE 33001 iodées IODEES 533001 iodes IODES 53001 iodés IODES 53001 iodez IODEZ 23001 iodiez IODIEZ 231001 iodle IODLE 37001 iodlé IODLE 37001 iodlée IODLEE 337001 iodlées IODLEES 5337001 iodles IODLES 537001 iodlés IODLES 537001 iodlez IODLEZ 237001 iodliez IODLIEZ 2317001 isoglosse ISOGLOSSE 355079051 isoglosses ISOGLOSSES 5355079051 isole ISOLE 37051 isolé ISOLE 37051 isolée ISOLEE 337051 isolées ISOLEES 5337051 isoles ISOLES 537051 isolés ISOLES 537051 isolez ISOLEZ 237051 isoliez ISOLIEZ 2317051 le LE 37 lebel LEBEL 73837 lebels LEBELS 573837 lège LEGE 3937 lèges LEGES 53937 legs LEGS 5937 lei LEI 137 les LES 537 lès LES 537 lésé LESE 3537 lèse LESE 3537 lésée LESEE 33537 lésées LESEES 533537 lésés LESES 53537 lèses LESES 53537 lésez LESEZ 23537 lésiez LESIEZ 231537 li LI 17 libelle LIBELLE 3773817 libellé LIBELLE 3773817 libellée LIBELLEE 33773817 libellées LIBELLEES 533773817 libelles LIBELLES 53773817 libellés LIBELLES 53773817 libellez LIBELLEZ 23773817 libelliez LIBELLIEZ 231773817 libido LIBIDO 001817 libidos LIBIDOS 5001817 lido LIDO 0017 lidos LIDOS 50017 lie LIE 317 lié LIE 317 lied LIED 0317 lieds LIEDS 50317 liée LIEE 3317 liées LIEES 53317 liégé LIEGE 39317 liège LIEGE 39317 liégée LIEGEE 339317 liégées LIEGEES 5339317 liégeois LIEGEOIS 51039317 liégeoise LIEGEOISE 351039317 liégeoises LIEGEOISES 5351039317 liégés LIEGES 539317 lièges LIEGES 539317 liégez LIEGEZ 239317 liégiez LIEGIEZ 2319317 lies LIES 5317 liés LIES 5317 liesse LIESSE 355317 liesses LIESSES 5355317 liez LIEZ 2317 lige LIGE 3917 liges LIGES 53917 ligie LIGIE 31917 ligies LIGIES 531917 liiez LIIEZ 23117 lis LIS 517 lise LISE 3517 lises LISES 53517 lisez LISEZ 23517 lisible LISIBLE 3781517 lisibles LISIBLES 53781517 lisiez LISIEZ 231517 lisse LISSE 35517 lissé LISSE 35517 lissée LISSEE 335517 lissées LISSEES 5335517 lisses LISSES 535517 lissés LISSES 535517 lissez LISSEZ 235517 lissiez LISSIEZ 2315517 lob LOB 807 lobbies LOBBIES 5318807 lobe LOBE 3807 lobé LOBE 3807 lobée LOBEE 33807 lobées LOBEES 533807 lobélie LOBELIE 3173807 lobélies LOBELIES 53173807 lobes LOBES 53807 lobés LOBES 53807 lobez LOBEZ 23807 lobiez LOBIEZ 231807 lobs LOBS 5807 lods LODS 5007 loess LOESS 55307 loge LOGE 3907 logé LOGE 3907 logée LOGEE 33907 logées LOGEES 533907 loges LOGES 53907 logés LOGES 53907 logez LOGEZ 23907 logiez LOGIEZ 231907 logis LOGIS 51907 logo LOGO 0907 logos LOGOS 50907 loi LOI 107 lois LOIS 5107 loisible LOISIBLE 37815107 loisibles LOISIBLES 537815107 lolo LOLO 0707 lolos LOLOS 50707 obéi OBEI 1380 obéis OBEIS 51380 obéisse OBEISSE 3551380 obéisses OBEISSES 53551380 obéissez OBEISSEZ 23551380 obéissiez OBEISSIEZ 231551380 obel OBEL 7380 obèle OBELE 37380 obèles OBELES 537380 obels OBELS 57380 obèse OBESE 35380 obèses OBESES 535380 oblige OBLIGE 391780 obligé OBLIGE 391780 obligée OBLIGEE 3391780 obligées OBLIGEES 53391780 obliges OBLIGES 5391780 obligés OBLIGES 5391780 obligez OBLIGEZ 2391780 obligiez OBLIGIEZ 23191780 obole OBOLE 37080 oboles OBOLES 537080 obsédé OBSEDE 303580 obsède OBSEDE 303580 obsédée OBSEDEE 3303580 obsédées OBSEDEES 53303580 obsédés OBSEDES 5303580 obsèdes OBSEDES 5303580 obsédez OBSEDEZ 2303580 obsédiez OBSEDIEZ 23103580 ode ODE 300 odes ODES 5300 oeil OEIL 7130 oh OH 40 ohé OHE 340 oie OIE 310 oies OIES 5310 oïl OIL 710 oille OILLE 37710 oilles OILLES 537710 ois OIS 510 oiselé OISELE 373510 oiselée OISELEE 3373510 oiselées OISELEES 53373510 oiselés OISELES 5373510 oiselez OISELEZ 2373510 oiseliez OISELIEZ 23173510 oiselle OISELLE 3773510 oiselles OISELLES 53773510 olé OLE 370 ollé OLLE 3770 os OS 50 ose OSE 350 osé OSE 350 osée OSEE 3350 osées OSEES 53350 oseille OSEILLE 3771350 oseilles OSEILLES 53771350 oses OSES 5350 osés OSES 5350 osez OSEZ 2350 oside OSIDE 30150 osides OSIDES 530150 osiez OSIEZ 23150 se SE 35 sébile SEBILE 371835 sébiles SEBILES 5371835 séide SEIDE 30135 séides SEIDES 530135 seigle SEIGLE 379135 seigles SEIGLES 5379135 seille SEILLE 377135 seilles SEILLES 5377135 seize SEIZE 32135 sel SEL 735 selle SELLE 37735 sellé SELLE 37735 sellée SELLEE 337735 sellées SELLEES 5337735 selles SELLES 537735 sellés SELLES 537735 sellez SELLEZ 237735 selliez SELLIEZ 2317735 sels SELS 5735 ses SES 535 sessile SESSILE 3715535 sessiles SESSILES 53715535 si SI 15 sied SIED 0315 siée SIEE 3315 siégé SIEGE 39315 siège SIEGE 39315 sièges SIEGES 539315 siégez SIEGEZ 239315 siégiez SIEGIEZ 2319315 sigillé SIGILLE 3771915 sigillée SIGILLEE 33771915 sigillées SIGILLEES 533771915 sigillés SIGILLES 53771915 sigisbée SIGISBEE 33851915 sigisbées SIGISBEES 533851915 sigle SIGLE 37915 sigles SIGLES 537915 sil SIL 715 silo SILO 0715 silos SILOS 50715 sils SILS 5715 sis SIS 515 sise SISE 3515 sises SISES 53515 sodé SODE 3005 sodée SODEE 33005 sodées SODEES 533005 sodés SODES 53005 soi SOI 105 soie SOIE 3105 soies SOIES 53105 sois SOIS 5105 sol SOL 705 solde SOLDE 30705 soldé SOLDE 30705 soldée SOLDEE 330705 soldées SOLDEES 5330705 soldes SOLDES 530705 soldés SOLDES 530705 soldez SOLDEZ 230705 soldiez SOLDIEZ 2310705 sole SOLE 3705 soleil SOLEIL 713705 soleils SOLEILS 5713705 soles SOLES 53705 solide SOLIDE 301705 solides SOLIDES 5301705 solo SOLO 0705 solos SOLOS 50705 sols SOLS 5705 sosie SOSIE 31505 sosies SOSIES 531505 zée ZEE 332 zées ZEES 5332 zélé ZELE 3732 zèle ZELE 3732 zélée ZELEE 33732 zélées ZELEES 533732 zélés ZELES 53732 zèles ZELES 53732 zellige ZELLIGE 3917732 zelliges ZELLIGES 53917732 zibe ZIBE 3812 zibé ZIBE 3812 zibée ZIBEE 33812 zibées ZIBEES 533812 zibes ZIBES 53812 zibés ZIBES 53812 zibez ZIBEZ 23812 zibiez ZIBIEZ 231812 zig ZIG 912 zigs ZIGS 5912 zizi ZIZI 1212 zizis ZIZIS 51212 zoïle ZOILE 37102 zoïles ZOILES 537102 zoo ZOO 002 zooglée ZOOGLEE 3379002 zooglées ZOOGLEES 53379002 zooïde ZOOIDE 301002 zooïdes ZOOIDES 5301002 zoologie ZOOLOGIE 31907002 zoologies ZOOLOGIES 531907002 zoos ZOOS 5002 zozo ZOZO 0202 zozos ZOZOS 50202
On cherche maintenant les mots ne contenant que des lettres données, au plus un certain nombre de fois. Il faut donc écrire une fonction qui construit un dictionnaire des nombres d'occurrences de chaque caratère dans une chaîne, puis une fonction qui compare deux tels dictionnaires.
# On lit le dictionnaire sous forme d'une liste de lignes, sans le \n (pour changer)
ll = [w.rstrip() for w in open('liste.de.mots.francais.frgut.txt',encoding='latin1').readlines()]
# On se débarasse des lettres accentuées
aa = 'àâäéèêëîïôöûüùÿç'
bb = 'aaaeeeeiioouuuyc'
tt = str.maketrans(aa,bb)
# et on convertit tout en majuscules
ll = [w.translate(tt).upper() for w in ll]
from string import ascii_uppercase as AA
# Statistiques d'une chaîne : nombre d'occurences de chaque lettre de l'alphabet
def st(w):
return {x:w.count(x) for x in AA}
# On les précalcule pour tout le dictionnaire
statlist = [(w, st(w)) for w in ll]
# Comparaison de deux dictionnaires
def compare(d,e):
return all([d[k]<=e[k] for k in AA])
def lookup(w):
d = st(w)
words = [x[0] for x in statlist if compare(x[1],d)]
m = max(map(len,words))
return [w for w in words if len(w)==m]
lookup('ZERBHGDETGFGFDDGHJ')
['GREFFEZ']
lookup('XWRDYTRERASZ')
['DARTRES', 'RETARDS', 'STEWARD']
Il existe une solution courte utilisant une expression régulière, mais elles n'ont pas encore été traitées en cours, et ce n'est pas ce qui était demandé ici.
Il faut comprendre deux choses :
Plutôt que d'essayer de déterminer ce qui est de l'espace ou de la ponctuation, il vaut mieux garder les lettres. x.isalpha()
nous dit si x est considéré comme une lettre.
Le résultat doit être une chaîne que l'on construit caractère par caractère. On empile donc ces caractères dans une liste ll
qu'on écrasera à la fin avec la méthode join
de la chaîne vide.
Au départ, ll
est vide. On va lire un par un les caractères de la chaîne s
que l'on veut brouiller. On la parcourt en gérant un indice i
. Si le caractère s[i]
n'est pas une lettre, on l'insère à la fin de ll
et on passe au suivant. Si c'est une lettre, on l'insère dans une liste auxiliaire mm
et on continue jusqu'à ce qu'on rencontre de nouveau un caractère non alphabétique. mm
contient alors un mot. S'il n'a pas au moins 4 lettres, on ne peut pas le mélanger, on le rajoute donc tel quel à la fin de ll
. Sinon, on le mélange avant de l'ajouter. On réinitialise mm
à la liste vide, on met a jour l'indice i
et c'est reparti.
Pour appeler le programme sur un fichier, on devra préciser l'encodage. Si on ne donne pas d'argument, le script affichera un prompt et demandera du texte.
#!/usr/bin/env python
from random import shuffle
def blurr(s):
ll = []; i=0
while i in range(len(s)):
mm=[]
while i<len(s) and s[i].isalpha():
mm.append(s[i])
i+=1
if mm:
if len(mm)>3:
uu=mm[1:-1]; shuffle(uu) # Mélange la liste en place, il faut lui donner un nom
ll.extend([mm[0]]+uu+[mm[-1]])
else:
ll.extend(mm)
continue
else:
ll.append(s[i]):
i+=1
return ''.join(ll)
if __name__=="__main__":
import sys
try:
s = open(sys.argv[1],encoding=sys.argv[2]).read()
print (blurr(s))
except:
s = input('texte: ')
print ('---> ', blurr(s))
texte: Qand les bornes sont dépassées il n'y a plus de limites ! ---> Qnad les brones sont daéepssés il n'y a plus de ltemiis !
$ cat corbeau.txt Maître Corbeau, sur un arbre perché, Tenait en son bec un fromage. Maître Renard, par l’odeur alléché, Lui tint à peu près ce langage : « Hé ! bonjour, Monsieur du Corbeau. Que vous êtes joli ! que vous me semblez beau ! Sans mentir, si votre ramage Se rapporte à votre plumage, Vous êtes le Phénix des hôtes de ces bois. » À ces mots le Corbeau ne se sent pas de joie ; Et pour montrer sa belle voix, Il ouvre un large bec, laisse tomber sa proie. Le Renard s’en saisit, et dit : « Mon bon Monsieur, Apprenez que tout flatteur Vit aux dépens de celui qui l’écoute : Cette leçon vaut bien un fromage, sans doute. » Le Corbeau, honteux et confus, Jura, mais un peu tard, qu’on ne l’y prendrait plus. $ ./blur3.py corbeau.txt utf8 Mîtrae Craboeu, sur un abrre pecrhé, Tinaet en son bec un fgrmoae. Marîte Renard, par l’oeudr aélclhé, Lui tnit à peu près ce laggane : « Hé ! bonujor, Meiuonsr du Corbeau. Que vous êtes joli ! que vous me slebmez baeu ! Snas mniter, si vrote rmagae Se rapotpre à vrote pumlgae, Vous êtes le Pnhiéx des hôets de ces bois. » À ces mtos le Caorebu ne se sent pas de jioe ; Et puor mrtoner sa blele viox, Il orvue un lrgae bec, lissae tebmor sa porie. Le Rarned s’en sasiit, et dit : « Mon bon Msnieour, Aperenpz que tuot fettlaur Vit aux dpeéns de cueli qui l’éuotce : Ctete loçen vaut bein un foramge, sans dtoue. » Le Coaerbu, houetnx et cunfos, Jrua, mais un peu trad, qu’on ne l’y paneidrrt plus.