Solution du TD 2

Exercice 1

a) La syntaxe chaine[i:j:k] , où la pas k peut être négatif, et le test d'égalité entre objets (ici de type str) permettent d'écrire :

In [1]:
def is_palindrome(w):  return w == w[::-1]
In [2]:
is_palindrome('able was I ere I saw elba')
Out[2]:
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

In [3]:
def is_pangram(w): return len({x.lower() for x in w if x.isalpha()}) == 26
In [4]:
is_pangram('Monsieur Jack, vous dactylographiez bien mieux que votre ami Wolf')
Out[4]:
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

In [5]:
def remove_adjacent(ll): return  ll and  [ll[i] for i in range(len(ll)-1) if ll[i+1]!=ll[i] ]+[ll[-1]]
In [6]:
remove_adjacent([1,1,3,3,5,4,2,1,3,3,1,2,1,1])
Out[6]:
[1, 3, 5, 4, 2, 1, 3, 1, 2, 1]
In [7]:
# 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] ]
In [8]:
remove_adjacent([1,1,3,3,5,4,2,1,3,3,1,2,1,1])
Out[8]:
[1, 3, 5, 4, 2, 1, 3, 1, 2, 1]

d) Remarquer les fonctions de conversion.

In [9]:
def digits_sum(n): return sum([int(c) for c in str(n)])
In [10]:
digits_sum(2**100)
Out[10]:
115

Exercice 2

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.

In [11]:
# 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 ='aaeeeeiiouuuc'
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

Exercice 2 : Scrabble

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.

In [12]:
# 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]
In [13]:
lookup('ZERBHGDETGFGFDDGHJ')
Out[13]:
['GREFFEZ']
In [14]:
lookup('XWRDYTRERASZ')
Out[14]:
['DARTRES', 'RETARDS', 'STEWARD']

Exercice 3

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.

In [15]:
#!/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.