Exercices de fin d'années

Voici des exercices qui permettent de tester tes capacités à coder en Python.

Ils proviennent du très bon site Codex: le code par les exercices

Exerice 1 : Indice du minimum⚓︎

Complète la fonction indice_min qui prend en paramètre un tableau non vide de nombres et qui renvoie l'indice de la première occurrence du minimum de ce tableau.

Les tableaux seront représentés sous forme de liste Python.

Contraintes

On n'utilisera pas les fonctions min et index.

Exemples
1
2
3
4
5
6
>>> indice_min([5])
0
>>> indice_min([2, 4, 1, 1])
2
>>> indice_min([5, 3, 2, 5, 2])
2
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5
.128013it3a;dvn2S5wbcy14: f-up08)_eklohrP=[s6(]/mg7050g0C0c0e0b0E0L0t0o0E0e0L0L0J010c0b0x010406050L0w0Q0Q0e0H0p040k0F0E0w0-0F0i050P0@0_0{0}0=0x04051d161g0P1d0=0g0b0h0#0%0)0+0%0i0R0w0e0R0C0v0x0p0c0G140t0G0b0R0G0E1I0G0c0:050W0n0E0C1p0(0*011H1J1L1J0c1R1T1P0c0H1e1D0#100L0x0e0i0+0j011V1r010u0Y0C0i0e0Q0C1P1;1?1{1X1~1T21230:0a0t0I0H0F0x0F0L0b130i0t0U1/0H0H0C0o2o16260i1e0P1D2B1+1-1,1Q0g281s0b0i202l1P1m1o0$1W2L2N0i0F2R1P0x2u1e2z2B2(0?1=2p2T1|2X0H0`0E1P0e1G2u0u0+030B0B0o2Y0C1L2W0F0v0q360:0q160e2)2,0;2+272.1X2:2=2@2_0C2{012}2 31332O360v1_040j3b3d1?3f2z2K013k0e2?1e2^0G2`2|2~300U3u2X3w0d0:0d3B2y3e0=3F3i0+3I3K053M3O3q3Q3t2M3v370r0:0r3Z173#3g2-1q3j0F2;3J3m3N3o3P3s3S3=3U370l0:0l3{2(3$2,3G3*453.3r3R324b35370M0:0M4h3}3%403)423l3L3n3p4p3;343w0S0:0S4y3D4j3h4B3H4D444F464H3:4a4K370z0:0z4P2A1h2$162R2E0g1-2J3(014q2Q1n1e2#0C2%3e3!3D054q50270b0g0+2~2z3w0q3m585a494r4$380t2c0C5h4q3T4t382B3c3~3G0D0:0U0u524,4A2U010m0:0t5C563 5F0i0u0:2M1m0o0C0B0Q2M5K5w4^0/040N5Y5E2/0:2X0Q0n2u0L5(4k5!0:0A0s5K0=3|533F5g015b2,3w3y3,0t5 4!5j3?3x1`5n5p4J6a640P3c0t6k5J5)3j0:5W0i0b5K6m5=4T0F0:0J6t5Z4T0i5+0F5-5/5;4S5F5#0K6I5M1|5W0:0y6N3G5#0O5`6T670B5c373W4F6Z5q4s3V6c225o605i5r6,5u046l6u6J5*040b5V2M6s5|2A6`6O1X6x046z726^6B5F6Q046S7a5{2*5~596:6#0v3^6(7l686=3@6-236e4#6a7p3B6_7c1|5y040u426A6n3)5Q7J6v5F0F5H6}157a744l0n0:0H1?1y6T5?5$7$6C7X042b7)6K0:5%7a7D6o045,5.0C5:7=7K015#0A5^6X7}4k6Z7n4e7q7x694c0v4e5m6.8a7t8d1P6i6^6_6l7?0+7F0b5B7U8p3H6E6G7{7.1|6L8A7@717j7O8B0:6W8u7~77020E0c0f7N6{7@6q8F517~5#5_7h6Y7r6!624u5f8%6*5k4v8f7w6:8-6a4v6@8n8`7V4^6D048V8S750+77792(8|6C8x7`7|8G8T0+8C849d8w6}8D9e8J839c2p868)0v4M898=6f8c4M8:6/7s6+379t7B8{7C7~8~6~908L8H766y914l7M8#9g9p8%7n4(9u9B5k4(9z8h9C0v9Y9F6k8v7F2u0c0w0H7T968v9J6 6r9n510P554-4 4/4|160c4=a52H2C0e1Sa20P4:5{0U0W0Y0L04.

Exerice 2 : Tri par sélection⚓︎

Complète les fonctions :

  • position_minimum

  • tri-selection

La fonction tri_selection qui prend en paramètre un tableau tableau de nombres entiers et qui trie ce tableau en place (c'est-à-dire que le tableau est modifié) par ordre croissant des valeurs.

On utilisera l'algorithme suivant :

  • On parcourt le tableau de gauche Ă  droite :
    • on recherche le minimum du tableau entre cette position courante et la fin du tableau
    • on Ă©change alors les 2 valeurs
Exemples
1
2
3
4
>>> tab = [1, 52, 6, -9, 12]
>>> tri_selection(tab)
>>> tab
[-9, 1, 6, 12, 52]
1
2
3
4
>>> tab_vide = []
>>> tri_selection(tab_vide)
>>> tab_vide
[]
1
2
3
4
>>> singleton = [9]
>>> tri_selection(singleton)
>>> singleton
[9]
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Exerice 3 : Dictionnaire d'occurrences⚓︎

Occurrence d'un caractère dans une phrase

D'après Le Larousse : « En logique, place occupée par un symbole dans une formule. »

  • Le nombre d'occurrences du caractère "o" dans "bonjour" est 2 ;
  • le nombre d'occurrences du caractère "b" dans "bonjour" est 1 ;
  • le nombre d'occurrences du caractère "B" dans "bonjour" est 0 ;
  • le nombre d'occurrences du caractère " " dans "Bonjour Ă  tous !" est 3.

On souhaite stocker les nombres d'occurrences dans un dictionnaire dont les clés sont les caractères de la phrase et les valeurs le nombre d'occurrences du caractère.

Écrire une fonction occurrence_caracteres prenant comme paramètre une chaine de caractères phrase. Cette fonction doit renvoyer un dictionnaire des nombres d'occurrences des caractères présents dans phrase.

Exemples
1
2
3
4
>>> occurrence_caracteres("Bonjour Ă  tous !")
{'B': 1, 'o': 3, 'n': 1, 'j': 1, 'u': 2, 'r': 1, ' ': 3, 'Ă ': 1, 't': 1, 's': 1, '!': 1}
>>> occurrence_caracteres("ababbab")
{"a": 3, "b": 4}

On rappelle que l'ordre des clés n'a pas d'importance pour comparer deux dictionnaires.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5
.128013it3a;dvn{2S5wbcy+14: f-upI8)_}9eklohrP=[s6(]/mg7050g0G0c0e0b0I0P0v0p0I0e0P0P0N010c0b0z010406050P0y0U0U0e0L0q040l0J0I0y0;0J0i050T0{0}0 110_0z04051h1a1k0T1h0_0g0b0h0)0+0-0/0+0i0V0y0e0V0G0x0z0q0c0K180v0K0b0V0K0I1M0K0c0@050!0o0I0G1t0,0.011L1N1P1N0c1V1X1T0c0L1i1H0)140P0z0e0i0/0k011Z1v010w0$0G0i0e0U0G1T1^1`1 1#221X25270@0a0v0M0L0J0z0J0P0b170i0v0Y1?0L0L0G0p2s1a2a0i1i0T1H2F1/1;1:1U0g2c1w0b0i242p1T1q1s0*1!2P2R0i0J2V1T0z2y1i2D2F2,0`1_2t2X202#0L0~0I1T0e1K2y0w0/030D0D0p2$0G1P2!0J0x0Q0x0s0@0s1a0e2-2:0^2/2b2=1#2@2_2{2}0G2 01313335372S3a0x1}040k3g3i1`3k2D2O013p0e2`1i2|0K2~3032340Y3z2#3B0d0@0d3G2C3j0_3K3n0/3N3P053R3T3v3V3y2Q3A3b0t0@0t3(1b3*3l2;1u3o0J2^3O3r3S3t3U3x3X3`3Z3b0m0@0m402,3+2:3L3/4a3?3w3W364g393b0Q0@0Q4m423,453.473q3Q3s3u4u3_383B0W0@0W4D3I4o3m4G3M4I494K4b4M3^4f4P3b0B0@0B4U2E1l2*1a2V2I0g1;2N3-014v2U1r1i2)0G2+3j3)3I054v552b0b0g0/322D3B3d4K5d5f4e4w4+3c1~2g0G5m4v3Y4y5q2F3h433L0H0@0Y0w574;4F2Y010n0@0v5H5b445K0i0w0@0J0p0p0y2x240p0G330 0e2A0G2y0P5P5B4}0?040R5/5J2?0@0z3S0,0G5^4p5;0@0C0u5P0_41583K5l015g2:3B3D3;0v6b4)5o3{3C5r265t6c5n5w6f1T0T3h0v6y5O5_3o5V5X5Z2y0i5$5.682E6A614Y0J0@0N5P6M4X5K5=0j0E6S5:4Y0p5j030v0A0i2r0b3O0b0P0e2s2u02030d0F0f0y2t1q2A0b18250b2y0v0h5d5 6K3k795B6j0D5h3b3#5k5e6r5v4x3!6o275u4O6m7h3G6z6T5R205D040w476Z6B3.0@0p5)5+2y7D6N5K0J5M042Q7L6U5`045|0L5~607T1#5=6579672.6a7j6d1`3B3}7i7q4*6m3}0v5s7=6l4h0x7:7u7v6z6!5K7z0b5G797w4q7G7I0c5,782,894}7O0@7R88837U5W5Y5!6H0G6J7*7M207$667Z2t7d7f0x4j7;7k7r7}4j7_6p7{6t4i6v6x818S8n6C048p6F5#8t8A3L5=0O8#4}0i8b7X7J8f567E015=0S7S7x1#6P040r6R8m8;0U0b3e8z7b7+5m8D4A8G6k8O3a7o6q9b7m4z8Q048S6y8U0/7z360P8/698w7#0@7%4n8#8C6e3b4R9a6s9h0x4R8L7p8H7?7}9D809l828;8+8W6E8r6I8)4Y8%9Y5S8,5*8d7K959u0/8?8^3L8{8~8g9n0191937(9z7,7e9B0x4-9E7l5p4-9J9f9Fa49j7v9@7z2y0c5Z198 9,3M6D8q6G9X9{7b0T5a4=544@511a0c4`ax2L2G0e1Wau0T4^670Y0!0$0P04.

Exercice 4 : Rendu de monnaie récursif⚓︎

On s'intéresse à un algorithme récursif qui permet de rendre la monnaie à partir d'une liste donnée de valeurs de pièces et de billets.

Le système de monnaie est donné sous forme d'une liste de valeurs décroissantes définie de façon globale et qui peut être utilisée dans les fonctions sans être donnée en paramètre.

Système monétaire utilisé
PIECES = [100, 50, 20, 10, 5, 2, 1]

On suppose qu'il n'y a pas de limitation quant au nombre de pièces et billets disponibles.

On souhaite, étant donnée une somme à rendre, déterminer la plus petite liste de pièces dont la somme est égale à celle-ci.

L'algorithme utilisé est le suivant :

  • On regarde les valeurs possibles en partant de la plus grande;
  • Si on peut rendre la valeur considĂ©rĂ©e, on le fait.
  • Sinon on passe Ă  la valeur infĂ©rieure.
  • On continue tant que l'on n'a pas tout rendu.

La fonction rendu_monnaie prend en paramètre un entier a_rendre qui correspond à la somme à rendre et renvoie la liste des valeurs rendues, dans l'ordre décroissant.

Cette fonction utilise une fonction récursive rendu_monnaie_rec qui implémente l'algorithme ci-dessus.

Les deux façons d'écrire rendu_monnaie_rec

On propose 2 façons d'écrire la fonction rendu_monnaie_rec :

Dans cette version, la fonction rendu_monnaie_rec prend 2 paramètres :

  • a_rendre : un entier qui correspond Ă  la somme Ă  rendre.
  • i : un entier qui correspond Ă  l'indice de la valeur considĂ©rĂ©e dans PIECES.

Elle renvoie la liste des valeurs rendues, dans l'ordre décroissant.

Si on peut rendre PIECES[i], on concatène cette valeur devant la liste obtenue par l'appel récursif.

Cette version est plus simple à écrire, mais la concaténation nécessite de recopier toutes les valeurs de la liste à chaque fois, ce qui donne un coût quadratique à cette implémentation.

Exemples
1
2
3
4
>>> rendu_monnaie(68)
[50, 10, 5, 2, 1]
>>> rendu_monnaie(291)
[100, 100, 50, 20, 20, 1]
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5
.128013ita;,En2R7+14L fIj08elor=[ûà]/mC3dv.S5éwbcyq:-up)_9hxPès6(gk050I0v0c0d0b0w0(0p0Q0w0d0(0(0z010c0b0W010406050(0V0F0F0d0y0R040L0x0w0V100x0h0p020d0F0W0e0p0j0v1a0y0S0V0v0(050E17191b1d150W04051I1B1L0E1I150I0b0J0^0`0|0~0`0h0+0V0d0+0v0U0W0R0c0!1k0p0!0b0+0!0w1;0!0c13050:0P0w0v1U0{0}011:1=1@1=0c1}1 1{0c0y1J1,0^1g0(0W0d0h0~0i01211W010q0=0v0h1o0v1{2j2l2q232t1 2w0F2y040a0p0$0y0x0W0x0(0b1j1l0.2h0y0y0v0Q2T1B2A0h1J0E1,2)2d2f2e1|0I2C1X0b0h2v2Q1{1R1T0_222?2^0h0x2|1{0W2Y1J2%2)39162k1l2~2r320y1a0w1{0d1/2Y0q0~030Y0Y0Q330v1@310x0U0Z0U0m130p0m1B0d3a3d143c2B3f233h3j3l3n0v3p013r3t3v3x2_3A0U2o040p0i3H3J2l3L2%2=013Q0d3k1J3m0!3o3q3s3u0.3!323$0H3E0H3,2$3K153:3O0~3?3^053`3|3W3~3Z2@3#3B0n3E0n471C493M3e1V3P0x3i3@3S3{3U3}3Y404m423B0M3E0M4s394a3d3;4e4C4i3X3 3w4I3z3B0)3E0)4O4u4b4x4d4z3R3_3T3V4W4l3y3$0k3E0k4)3.4Q3N4,3=4.4B4:4D4=4k4H4^3B0u3E0u4}2(4 4w2 524A4f4h4E4j4G4Y5a3A3E0Z5f3/4R4c5k4/4g4;4F4X414!3C0t130m0t5w5h4S535m5D5p5F4Z3$0m3D045X5N4v5P5l4U5o4?594n3C3(0m3+0E3I484~5$5z4T554V585r5-0m445Z465=3-5g5_515{5C565E4@604p5Z4r655@674+5j6a5n575q5G5W4L5Z4N6j4t3.1M371B2|2,0I2f2;5z4X2{1S1J360v383K6k1J4X6P2B0b0I0~3s2%5W3S6W6Y6r5V3B3D0p2G0v6(5U5s5Y476m3g130$0r0g0G0g0L6R0p685j0x130z71732r12040A6R79230F0b5K0t5M6y2(7f0~7b0f786^7g7i040M7l3b7t7p137r7m3)7o017h130i7y6Q7A017q7s5y517I5Z7L6z7N7P7E727N7T6w7z7R5j7Y397!7)2r7T5;7(507*7C7Q7?7/7v3G7E7G7b0D6R157~3:6%016Z3d3$3(5C865~6s3B2o6-2x6:6e4J3%1{65837=1l8d0Y6!3B628c6X876)5s448i2H8k5,8m8x8p7e858z882l3$6g8y8G5 8m4p8E6/8A6;5-8R6j7N0,130.0q8L7.230O3E8-7`3P0q132Y0h0I0V0Y0F1k2w0b0v0Y2Y0Q8=5i7a130*974S130d942v0I2Y9c5z7+3K7-8?4d130b9k517b0X0T829c8t8v0U6u8S8Z8l5H4L8X8T8f9C8o3I0p9P9o98238)040b8,7Z7G0h9e9g8{9j9Y7N75040z779)8.0~7T7V7n7X139x7E8q7M4R9A894#6$8N8B5-4$9J9F8H5H4$2)9O9Qae7G9U2Y0c0V0y0h7_9S7B7c819{9za39B4`4:8t8!8m4`a78e6*0Uaw3,af7N9!040Wan3;9+9.7,9Z6`6|6~70849:7O137daX9p3=9r9t7@04ar4Pat6(9B5caxa3az5H5caCa48ma=aH9Qag9r9XaRaJ13aM9/a%9+020w0c0eaQ9naS049f8`9i0va*99049`a.a$8saua05ta?9KaE0Z2p6.by5sbAac3)aeb08(8_0/akamb8aoaZ7cbn3Pb6bTapa-bg9*130laN5`bL8{8}8 0h919395bWbR9bbs9dbi9$blb%519+0Ub|6nbVb@9l7^bPb^9sc39u130X9yb@9 8P6+5Jbxa88U5H5LbB8jck9LcnbGaIaY9U3w0(bmc9a+bq4ucebucg3C6?3may9G5W6,bCcqaE5X9NbHbI9R3;ahbMalc06_04bkb+900;b/2Zb;7bb?8rb^bj9h9(c:c4047Db4aYaKc8c|b9b#c!7u5Kc-cbcdc:cf0h5W8bcJa@cL6+8hcOaD6=8b8KcEa:bv61a2bD608Ddja|cm8J3I9|7W9~cFdb6+8Rdedt8m0m8Wdwa^5W8$5?bK048+b;8:7FcA3g8^c$9hc(b-c*d604c/9}a%aKc=9%czc^ca049wd8d-btdpcG0m9DdIcP6=9IdNdg3C9D65cua%cXajcZc6b(d#b*8~c)929g96dY23c.b;d/b`c@d{3;9m3.cV5z9=d*ccas7~0E6T6A6O6C6L1B0c6FeM2/2*0d1~eJ0E6D1H6UbQ2Y0F0Y0q0d0,930!621t1v1x1z0pcC6z1O3L1I0o3m0J0v0y2R1.360Ncy0h0c0N200I2l0@0`2W952T0p1z0c0^3w1 0p0de|0Q2h0h0Q0df52w2T0K060o203u0Bfh2Vfg0p1x0d9ifs0be/0f0p0C0^0d0Vcy0p8|2hfB0p3x0N0;2YfT20fb3ufqfs0Nfu0b1kfw0r0w0pe%1iff1l3U0q0/fM0w4z0@2V0Q0!0de/fl0W0W3w0p0y0N0Qak2R0qfM952O920yfX002vcy0FeTf$0@0J3@0vgfgt0p0W0b0%0Qe:0I0N0sfOc%1z0K1Me^04f;0pgvf^7hgx0#ff0|0d0Re}f$f?f!f%e{e}e 1lfm2Z724X3;1Y1!1$1(1*1/1^271_2zc}9eg89h7eeG3v3)2Pak0p0x0P0c2v0bgm0V3e0xfWfYg(gMe@830.0:0=0(04.

Exercice 5 : Tracer la courbe cube⚓︎

Le code suivant, à compléter, permet de tracer la courbe de la fonction cube (\(f: x -> x^3\)).

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Remarque : La courbe tracée s'affiche tout en bas de la page.

Exercice 6 : Tourner en rond⚓︎

On souhaite se diriger à l'intérieur d'une ville, et notamment savoir s'il est possible de tourner en rond.

On représente la circulation dans une ville par un graphe orienté, où chaque sommet correspond à un lieu de la ville et chaque arête au sens de circulation entre deux lieux.

Exemple de plan de circulation

flowchart LR
    A([Lycée]) --> B([Mairie])
    B --> A
    B --> E([Médiathèque])
    C([Port]) --> B
    B --> C
    D([Ecole]) --> G([Maison])
    E --> B
    E --> D
    G --> E
    E --> F([Stade])
    F --> G

Pour aller au Stade depuis le Lycée, on pourra emprunter le chemin Lycée - Mairie - Médiathèque - Stade.

Il est à noter que depuis la Médiathèque, on peut revenir à la Médiathèque en passant par l'Ecole puis la Maison.

Imaginons maintenant qu'il y a des travaux sur certaines routes qui sont désormais fermées. La circulation devient alors :

flowchart LR
    A([Lycée]) --> B([Mairie])
    B --> E([Médiathèque])
    C([Port]) --> B
    D([Ecole]) --> G([Maison])
    E --> D
    E --> F([Stade])
    F --> G

Dans ce nouveau graphe, il n'y a plus de chemin possible depuis la Maison vers le Port.

De plus, quel que soit le lieu, il n'existe pas de chemin qui part de ce lieu et qui y revient.

On représente ce graphe par un dictionnaire dans lequel :

  • les clĂ©s sont les chaĂ®nes de caractères correspondant aux noms des lieux,

  • les valeurs associĂ©es sont des listes de chaĂ®nes de caractères reprĂ©sentant les lieux vers lesquels on peut se diriger.

1. Fonction existe_chemin

On se demande si, connaissant un plan de circulation, il est possible de se rendre d'un point de départ à un point d'arrivée.

Vous devez donc d'écrire une fonction existe_chemin qui :

  • prend en paramètre un dictionnaire graphe reprĂ©sentant une telle circulation, une chaĂ®ne de caractères depart qui reprĂ©sente le lieu de dĂ©part et une chaĂ®ne de caractères arrivee qui reprĂ©sente le lieu d'arrivĂ©e ;

  • renvoie True si un chemin existe entre le lieu de dĂ©part et le lieu d'arrivĂ©e, False sinon.

Exemples

>>> circulation = {
...   "Lycee": ["Mairie"],
...   "Port": ["Mairie"],
...   "Mairie": ["Lycee", "Mediatheque", "Port"],
...   "Mediatheque": ["Mairie", "Ecole", "Stade"],
...   "Ecole": ["Maison"],
...   "Stade": ["Maison"],
...   "Maison": ["Mediatheque"],
... }
>>> existe_chemin(circulation, "Lycee", "Mediatheque")
True
>>> circulation_en_travaux = {
...   "Lycee": ["Mairie"],
...   "Port": ["Mairie"],
...   "Mairie": ["Mediatheque"],
...   "Mediatheque": ["Ecole", "Stade"],
...   "Ecole": ["Maison"],
...   "Stade": ["Maison"],
...   "Maison": [],
... }
>>> existe_chemin(circulation_en_travaux, "Maison", "Port")
False

Aide

On pourra utiliser un parcours en profondeur du graphe.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013it3adv,Fn{T2.S5wbcy14q: f-up08)_}9eklohxrP=[s6(]/mg7050f0J0c0e0b0L0T0y0s0L0e0T0T0R010c0b0C010406050T0B0Y0Y0e0P0t040o0M0L0B0^0M0j050X0 1113150}0C04051l1e1o0X1l0}0f0b0g0-0/0;0?0/0j0Z0B0e0Z0J0A0C0t0c0N1c0y0N0b0Z0N0L1Q0N0c0{050(0r0L0J1x0:0=011P1R1T1R0c1Z1#1X0c0P1m1L0-180T0C0e0j0?0m011%1z010z0*0J0j0e0Y0J1X1|1~231)261#292b0{0a0y0Q0P0M0C0M0T0b1b0j0y0$1`0P0P0J0s2w1e2e0j1m0X1L2J1?1^1@1Y0f2g1A0b0j282t1X1u1w0.1(2T2V0j0M2Z1X0C2C1m2H2J2:0~1}2x2#242)0P120L1X0e1O2C0z0?030G0G0s2*0J1T2(0M0A0u0m3e0{0y0u1e0e2;2@0|2?2f2_1)2{2}2 310J33013537393b2W3e3g21040y0m3l3n1~3p2H2S013u0e2~1m300N323436380$3E2)3G0A0d3i0d3M2G3o0}3Q3s0?3T3V053X3Z3A3#3D2U3F3f0A0v3i0v3/1f3;3q2^1y3t0M2|3U3w3Y3y3!3C3%413)430p3i0p482:3=2@3R3_4i3}3B3$3a4o3d430U3i0U4u4a3?4d3^4f3v3W3x3z4C403c3*0!3i0!4L3O4w3r4O3S4Q4h4S4j4U3 4n4X430E3i0E4$2I4(4c2$4+4g3`3|4k3~4m4E4?3g0I3i0I4{3P4x3@504R3{4T4l4D3(4G3g0u0D0{5q5d4}4y4,525k555m4F3*0u0u5s3k0X3m3:4%4b5w514A544V4=425p3I3f5u5M5g4z4.4B4;575T3e3,040u3.5I3N4|5Y4*5!5j4/5l4W5)0u455,475/5K5;4N4 5@534:565n5D4r5,4t61493O1p2.1e2Z2M0f1^2R5g4D2Y1v1m2-0J2/3o621m4D6x2f0b0f0?362H5D3w6E6G695C435F0y2k0J6M5B583h2J5J64240K0j0{0z2q0Y6z5=4 0q3i6,6!3t6%04380L1#2E0b1c0T6;5f4*6/3J704)4 6$0{0b0Y2s0P0c6z0y6-2`0{0$0w0B0J6z0}6g2I5M6L016H2@3*3I5j7t5%6a43216R2a6T7u6N6W7y5/7p2=3Q7A0G6I435+7z6F7I6V5)3,7F2b6U5{4p3g7U616=0?0K7j3y754~24737g7q6C7?3t0z0{0J0O0b0T0c0J370N0J0Y2U7=3R0`040V8b5Z0{0Z0P0e0C878g4*8d0h7f7h3t7:1}7d8o4 8q8s7-3S0{130P1v0J7n7`8t0?8d0F0x7o8b7Q7S3g5~7V7%5S7)44226S8X5(8Z8V5/0y8,7g8C6@0C278B714 0M0{0R8?767i047k7m8y248d0V0F8Q8K7P7W7v1~3*6c8W7X7(5o0A4r7#7H7B6O3g9e8+8-8L8D040g822v0J6 7`8.8@248_048{9B9t8d0k0H977O4x8S7w4H6K9a7J5)4I9l8%7C3g4I6Y3J9s8/0{8;1#921)9F0n9.3^8E0C0C280f9=01949|6@0$8w7e989D1)8N9N6y996M8T0A4Z4S7Q7Y8Z4Z9Y9g8Y9iae3M8-9C8}1)7/040q1P9-9I8C0M732)a32:ar7|9?049,8J9Oas0?9:9 7 830G9w0$9|948Oa86haa7Iac4^af9Uah9i4^ak9n6Wa(apaq9)a5aI380B8k0jaE3oaG3R9F9HaF9t8:8=a4aN01aPb8aH9u2s0CaW0{95aZ7ra#9b0j3*5aa)9Z9o0A5aa.9V8Zbqa=a?b05gau0b0z8|bd6@8F8HaLa 9taB791daza^9u8j8l8nbc8c0{0SaQ6^0Ma{1~a~a!bT8d0W8P7`7Na99P9Uac5q9Tbs6Wb`bwa+5D5r9%bBbB9tau2C0ca{bRb48C0K0s0{0l0P91b;8Rb^9R5p5Fbral8(9i5E8#7Gb|5|cpbAa?c66(4fbH4y7 0(9_cF5gbP048abSb96@bV8mbMb,b98db#bY8hb%b)a}bh04b/bk7{0y9Q9c6P7y30ag9h5D7E8$cr9!3G1X9rc4a@b9bEbGcPbdcMaDcK5?cH8lcU2IbC4*cMcOccbT6@9w2u849AaMbd8db:4vclabcn5*b{c{bt5-cv7$dAb}7+3md0d0b59+b7dqb10{9;cZda048l9_0j9{dS8zbib$0%dcc(96ckbYc.bo6P8Vc=a*c@d/dD9mbxct8*dIdJc59*9v9xdoc(cYdOc!d%cJdZ930{0Wd98^8`ee6#cf04chcjdud,cmc/5p9ed;cx8Z0u9kc`a/5|9qd}8,cC04c8caehatej0i3U0Tdd3p8K0X6B6i6w6k6t1e0c6neX2P2K0e1!eU0X6l7p0$0(0*0T04.
2. Fonction contient_cycle

Un promeneur se demande s'il est possible, connaissant le plan de circulation, de faire au moins une promenade débutant et se terminant au même endroit de la ville : une promenade allant du Lycée au Lycée ou une autre allant du Port au Port, etc.

Si au moins une telle promenade existe, on dit que le graphe représentant le plan de circulation contient un cycle.

Vous devez donc d'écrire une fonction contient_cycle qui :

  • prend en paramètre un dictionnaire graphe reprĂ©sentant une telle circulation ;

  • renvoie True si le graphe contient un cycle, False sinon.

La fonction existe_chemin de la question précédente est déjà importée dans cet éditeur.

Exemple
>>> circulation = {
...   "Lycee": ["Mairie"],
...   "Port": ["Mairie"],
...   "Mairie": ["Lycee", "Mediatheque", "Port"],
...   "Mediatheque": ["Mairie", "Ecole", "Stade"],
...   "Ecole": ["Maison"],
...   "Stade": ["Maison"],
...   "Maison": ["Mediatheque"],
... }
>>> contient_cycle(circulation)
True
>>> circulation_en_travaux = {
...   "Lycee": ["Mairie"],
...   "Port": ["Mairie"],
...   "Mairie": ["Mediatheque"],
...   "Mediatheque": ["Ecole", "Stade"],
...   "Ecole": ["Maison"],
...   "Stade": ["Maison"],
...   "Maison": [],
... }
>>> contient_cyle(circulation_en_travaux)
False

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013it3adv,FnT2S5wbcy14: f-up)_elohxrP=s(/mgk050f0C0c0e0b0D0K0v0q0D0e0K0K0J010c0b0z010406050K0y0N0N0e0H0r040m0E0D0y0*0E0j050M0;0?0^0`0/0z04051a131d0M1a0/0f0b0g0Y0!0$0(0!0j0O0y0e0O0C0x0z0r0c0F110v0F0b0O0F0D1F0F0c0-050T0p0D0C1m0#0%011E1G1I1G0c1O1Q1M0c0H1b1A0Y0}0K0z0e0j0(0l011S1o010w0V0C0j0e0N0C1M1.1:1^1U1{1Q1~200-0a0v0I0H0E0z0E0K0b100j0v0R1,0H0H0C0q2l13230j1b0M1A2y1(1*1)1N0f251p0b0j1}2i1M1j1l0Z1T2I2K0j0E2O1M0z2r1b2w2y2#0:1/2m2Q1_2U0H0@0D1M0e1D2r0w0(030B0B0q2V0C1I2T0E0x0s0n330-0s130e2$2)0.2(242+1U2-2/2;2?0C2^012`2|2~302L33351?040l393b1:3d2w2H013i0e2:1b2=0F2@2_2{2}0R3s2U3u0x0d0-0d3z2v3c0/3D3g0(3G3I053K3M3o3O3r2J3t340x0t0-0t3Y143!3e2*1n3h0E2.3H3k3L3m3N3q3Q3;3S3?0n0-0n3{2%1g2Z132O2B0f1*2G3%013P211b4m1c4k4i2%4t2!2)0v0b0f0(2{2w3T0s3k4F4H492 4b323?4L0v290C4O4t3R4S354L2y3a3~3E0P0-0R0w3Z3B4*4r0o0-0v4:2x4=403(0w0-2}0j0*1}0c2|0r0Z0C4`4C3f4}010,040L5a4|2R3F0-0O0H0e0z0F593|4;3$5d5f0A0u5a0/5t4{3D4N014I2)3T3w3+4E4G5G4P4!5J1@4W4Y3:315R4(040v5!4_5v5k4,040w425a5$4D4r0j0-1I0C0y5-5j1_0E4@042J5_5%2,5m5o5q5s2%611U5f5z5C3d6c4*5F5H1:3T3V3J5M5U4a5W3?3V4V1 4X5O4Z4R6j1M0M3a5#6C5.5c5(0-0b4/6c6E3 5k5;040C0G0b0K0c0C2|5r0N5 6e680(5f5h6!5/5d6O5n5p5r5i6#5e0-0h606*6N5=0b5@6:6_1_5f6@6K5`3h6{6}6)6F700-5y5A6~246g0B4J3?3^6l7g6w6p353^6s206n4Q7o3@6z6B6D7z740(5)2r0c0y0H12736;0P0q0-0k0H0y663}782m7g7i354e7l5N3/6o3=7X5S6t7t5Q4d7x5Z5#7B017D0S7G7I2#6L4+7M040i3H0K7R3B5B4i4B1e4k0M4w2z4o132C8d0e1P0C2y4m5B0R0T0V0K04.