Ep 38
ⶠTélécharger le sujet en pdf.
EXERCICE 1âïž
On considĂšre des mots Ă trous : ce sont des chaĂźnes de caractĂšres contenant uniquement des majuscules et des caractĂšres *
. Par exemple INFO*MA*IQUE
, ***I***E**
et
*S*
sont des mots Ă trous.
Programmer une fonction correspond
qui :
- prend en paramĂštres deux chaĂźnes de caractĂšres
mot
etmot_a_trous
oĂčmot_a_trous
est un mot à trous comme indiqué ci-dessus, - renvoie :
True
si on peut obtenirmot
en remplaçant convenablement les caractÚres'*'
demot_a_trous
.False
sinon.
Exemple :
>>> correspond('INFORMATIQUE', 'INFO*MA*IQUE')
True
>>> correspond('AUTOMATIQUE', 'INFO*MA*IQUE')
False
>>> correspond('STOP', 'S*')
False
>>> correspond('AUTO', '*UT*')
True
RĂ©ponse
Complétez le code ci-dessous
Solution
EXERCICE 2âïž
On considĂšre au plus 26 personnes A, B, C, D, E, F ... qui peuvent s'envoyer des messages avec deux rĂšgles Ă respecter :
- chaque personne ne peut envoyer des messages qu'Ă une seule personne (Ă©ventuellement elle-mĂȘme),
- chaque personne ne peut recevoir des messages qu'en provenance d'une seule personne (Ă©ventuellement elle-mĂȘme).
Voici un exemple - avec 6 personnes - de « plan d'envoi des messages » qui respecte les rÚgles ci-dessus, puisque chaque personne est présente une seule fois dans chaque colonne :
- A envoie ses messages Ă E
- E envoie ses messages Ă B
- B envoie ses messages Ă F
- F envoie ses messages Ă A
- C envoie ses messages Ă D
- D envoie ses messages Ă C
Et le dictionnaire correspondant Ă ce plan d'envoi est le suivant :
plan_a = {'A':'E', 'B':'F', 'C':'D', 'D':'C', 'E':'B', 'F':'A'}
Un cycle est une suite de personnes dans laquelle la derniĂšre est la mĂȘme que la premiĂšre.
Sur le plan d'envoi plan_a
des messages ci-dessus, il y a deux cycles distincts : un premier cycle avec A, E, B, F et un second cycle avec C et D.
En revanche, le plan dâenvoi plan_b
ci-dessous :
plan_b = {'A':'C', 'B':'F', 'C':'E', 'D':'A', 'E':'B', 'F':'D'}
comporte un unique cycle : A, C, E, B, F, D. Dans ce cas, lorsquâun plan dâenvoi comporte un unique cycle, on dit que le plan dâenvoi est cyclique.
Pour savoir si un plan d'envoi de messages comportant N personnes est cyclique, on peut utiliser l'algorithme ci-dessous :
- on part dâun expĂ©diteur (ici A) et on inspecte son destinataire dans le plan d'envoi,
- chaque destinataire devient Ă son tour expĂ©diteur, selon le plan dâenvoi, tant quâon ne « retombe » pas sur lâexpĂ©diteur initial,
- le plan dâenvoi est cyclique si on lâa parcouru en entier.
Compléter la fonction est_cyclique
en respectant la spécification.
Remarque : la fonction python len
permet d'obtenir la longueur d'un dictionnaire.
RĂ©ponse
Complétez le code ci-dessous
plan
correspondant Ă un plan d'envoi de messages (ici entre les personnes A, B, C, D, E, F).bksl-nl Renvoie True si le plan d'envoi de messages est cyclique et False sinon.bksl-nl '''bksl-nl expediteur = 'A'bksl-nl destinataire = plan[ ... ]bksl-nl nbpy-unddestinaires = 1bksl-nlbksl-nl while destinataire != ...:bksl-nl destinataire = plan[ ... ]bksl-nl nbpy-unddestinaires += ...bksl-nlbksl-nl return nbpy-unddestinaires == ...bksl-nlbksl-nl
Solution
plan
correspondant Ă un plan d'envoi de messages (ici entre les personnes A, B, C, D, E, F).bksl-nl Renvoie True si le plan d'envoi de messages est cyclique et False sinon.bksl-nl '''bksl-nl expediteur = 'A'bksl-nl destinataire = plan[expediteur]bksl-nl nbpy-unddestinaires = 1bksl-nlbksl-nl while destinataire != expediteur:bksl-nl destinataire = plan[destinataire]bksl-nl nbpy-unddestinaires += 1bksl-nlbksl-nl return nbpy-unddestinaires == len(plan)bksl-nlbksl-nl #testsbksl-nl print(estpy-undcyclique({'A':'E', 'F':'A', 'C':'D', 'E':'B', 'B':'F', 'D':'C'}))bksl-nl print(estpy-undcyclique({'A':'E', 'F':'C', 'C':'D', 'E':'B', 'B':'F', 'D':'A'}))bksl-nl print(estpy-undcyclique({'A':'B', 'F':'C', 'C':'D', 'E':'A', 'B':'F', 'D':'E'}))bksl-nl print(estpy-undcyclique({'A':'B', 'F':'A', 'C':'D', 'E':'C', 'B':'F', 'D':'E'}))bksl-nlbksl-nl
Exemple :
>>> est_cyclique({'A':'E', 'F':'A', 'C':'D', 'E':'B', 'B':'F', 'D':'C'})
False
>>> est_cyclique({'A':'E', 'F':'C', 'C':'D', 'E':'B', 'B':'F', 'D':'A'})
True
>>> est_cyclique({'A':'B', 'F':'C', 'C':'D', 'E':'A', 'B':'F', 'D':'E'})
True
>>> est_cyclique({'A':'B', 'F':'A', 'C':'D', 'E':'C', 'B':'F', 'D':'E'})
False