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
.128013oP;f 8lkg5:bry2a1h3tvw=u6e[(Sn]_s-c)7im/4p0d050S0A0u0q0M0h0H0f0J0h0q0H0H0x010u0M0Q010406050H0y0N0N0q0n0o040D0b0h0y0-0b0E050O0@0_0{0}0=0Q04051d161g0O1d0=0S0M0v0#0%0)0+0%0E0j0y0q0j0A0I0Q0o0u0s140f0s0M0j0s0h1I0s0u0:050W0m0h0A1p0(0*011H1J1L1J0u1R1T1P0u0n1e1D0#100H0Q0q0E0+0p011V1r010e0Y0A0E0q0N0A1P1;1?1{1X1~1T21230:0a0f0c0n0b0Q0b0H0M130E0f0U1/0n0n0A0J2o16260E1e0O1D2B1+1-1,1Q0S281s0M0E202l1P1m1o0$1W2L2N0E0b2R1P0Q2u1e2z2B2(0?1=2p2T1|2X0n0`0h1P0q1G2u0e0+030G0G0J2Y0A1L2W0b0I0r360:0r160q2)2,0;2+272.1X2:2=2@2_0A2{012}2 31332O360I1_040p3b3d1?3f2z2K013k0q2?1e2^0s2`2|2~300U3u2X3w0t0:0t3B2y3e0=3F3i0+3I3K053M3O3q3Q3t2M3v370P0:0P3Z173#3g2-1q3j0b2;3J3m3N3o3P3s3S3=3U370k0:0k3{2(3$2,3G3*453.3r3R324b35370z0:0z4h3}3%403)423l3L3n3p4p3;343w0L0:0L4y3D4j3h4B3H4D444F464H3:4a4K370g0:0g4P2A1h2$162R2E0S1-2J3(014q2Q1n1e2#0A2%3e3!3D054q50270M0S0+2~2z3w0r3m585a494r4$380f2c0A5h4q3T4t382B3c3~3G0i0:0U0e524,4A2U010w0:0f5C563 5F0E0e0:2M1m0J0A0G0N2M5K5w4^0/040C5Y5E2/0:2X0N0m2u0H5(4k5!0:0K0l5K0=3|533F5g015b2,3w3y3,0f5 4!5j3?3x1`5n5p4J6a640O3c0f6k5J5)3j0:5W0E0M5K6m5=4T0b0:0x6t5Z4T0E5+0b5-5/5;4S5F5#0B6I5M1|5W0:0R6N3G5#0F5`6T670G5c373W4F6Z5q4s3V6c225o605i5r6,5u046l6u6J5*040M5V2M6s5|2A6`6O1X6x046z726^6B5F6Q046S7a5{2*5~596:6#0I3^6(7l686=3@6-236e4#6a7p3B6_7c1|5y040e426A6n3)5Q7J6v5F0b5H6}157a744l0m0:0n1?1y6T5?5$7$6C7X042b7)6K0:5%7a7D6o045,5.0A5:7=7K015#0K5^6X7}4k6Z7n4e7q7x694c0I4e5m6.8a7t8d1P6i6^6_6l7?0+7F0M5B7U8p3H6E6G7{7.1|6L8A7@717j7O8B0:6W8u7~77020h0u0d7N6{7@6q8F517~5#5_7h6Y7r6!624u5f8%6*5k4v8f7w6:8-6a4v6@8n8`7V4^6D048V8S750+77792(8|6C8x7`7|8G8T0+8C849d8w6}8D9e8J839c2p868)0I4M898=6f8c4M8:6/7s6+379t7B8{7C7~8~6~908L8H766y914l7M8#9g9p8%7n4(9u9B5k4(9z8h9C0I9Y9F6k8v7F2u0u0y0n7T968v9J6 6r9n510O554-4 4/4|160u4=a52H2C0q1Sa20O4:5{0U0W0Y0H04.

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
Évaluations restantes : 5/5
.128013oP;f 8lkg5:j+,bry2a1h3tvw=u6e[(Sàn9]_s-c)7im/4p0d050X0D0x0t0R0h0M0f0O0h0t0M0M0A010x0R0V010406050M0B0S0S0t0q0r040G0b0h0B0=0b0I050T0|0~10120`0V04051i1b1l0T1i0`0X0R0y0*0,0.0:0,0I0j0B0t0j0D0N0V0r0x0v190f0v0R0j0v0h1N0v0x0^050#0p0h0D1u0-0/011M1O1Q1O0x1W1Y1U0x0q1j1I0*150M0V0t0I0:0s011!1w010e0%0D0I0t0S0D1U1_1{201$231Y26280^0a0f0c0q0b0V0b0M0R180I0f0Z1@0q0q0D0O2t1b2b0I1j0T1I2G1:1=1;1V0X2d1x0R0I252q1U1r1t0+1#2Q2S0I0b2W1U0V2z1j2E2G2-0{1`2u2Y212$0q0 0h1U0t1L2z0e0:030L0L0O2%0D1Q2#0b0N0k0N0u0^0f0u1b0t2.2;0_2:2c2?1$2^2`2|2~0D3001323436382T3b0N1~040f0s3i3k1{3m2E2P013r0t2{1j2}0v2 3133350Z3B2$3D0w3f0w3J2D3l0`3N3p0:3Q3S053U3W3x3Y3A2R3C3c0U3f0U3+1c3-3n2=1v3q0b2_3R3t3V3v3X3z3!3}3$3c0k3f0k432-3.2;3O3=4d3_3y3Z374j3a3c0C3f0C4p453/483;4a3s3T3u3w4x3|393D0Q3f0Q4G3L4r3o4J3P4L4c4N4e4P3{4i4S3c0g3f0g4X2F4Z472Z4$4b3?3^4f3`4h4z4.0N0J3f0J4?3M4s3:4{4M3@4O4g4y3#4B3d0W0^0u0W584^4t4%4}5f505h4A3D0u3e045z5p465r4|4v4 4Q4-3~3d3F0u3I0T3j3,4Y5E5b4u4)4w4,525L0u3(5B3*5Q3K4@5U4#5W5e4*5g4R5#405B425*5S5,4I4`5/4~4+515i5y4m5B4o5{445T5~2@5s5H625w530u4D5B4F694q5-5 6e5X5I5Z643c0u4U5B4W6n3l1m2+1b2W2J0X1=2O5b4y2V1s1j2*0D2,6C6a2F054y6S2c0R0X0:332E5y3t6!6$635x6w1 2h0D6,6h5#1U5{6c1$0i0^0Z0e5|6Y4_210z3f716p2@0e0^2p2r2t0L0S2R0R0S0}776{0:0@040F7l5a5.0^1-0D0t0B7r4!4`7o0o710f783q0^0R7z731$7o0P0l710`6U720f6+016%2;3D3F5e7V6u6.3E6:276=7W6-537!5*0f7=7F7m010M3F012z0O0v0D0q7~1Z0!0f2z0I0y0b0R1Z0h002R1r0O1Z0X0B0f7g0I7i0}0f0H0f1`0q0=0q2v8b8d0I8f1Z0R017Q7K7U6#7-6(3c5%7#8H7%533(0f6;6?5?4k0N8L7;7?7G3;7I8z7f7h7E8!010b0^0A8*7^0I7I8E7S5E7$0L8J0N5^8M8T5K8V408R7+905!926_3j7?7@7s4`6}040e4a8:9d2@0^0m9j7A210b75042R9o7L3;0p0^0q1{1D8F5b7o7q8^8;8?7S9c9p1$8-040n9v3O7g5m9D4#7C9R5V9y042g9V7B0^9G2/9I047v7x9%217N7O8@9+4s8`8|668 7-6@8V4m9428966v3b993G9b8Z7^9f0R709K8+8=9-0t1X7w7y9H9k7M0^0E9:7H049nan9M7n0^0K9Y4#9O020h0x0daB5 7uaj1Y9/aw9w017oaraO4t8$0X8(8masay040K7P7S7R9^6Z8N8{7Y4C6*a,9 5j4Da27,8O5L6k3Ja9a~9LaPah8eaX7Jaf7^9O8/b6ao8#au9@6C3N9`a.0N6y9}a`8V4Ua^a47(bk8Y7=8+9f2z0x0B0q1abaax3PaVb4be3L8_a,8|4:4N8`a=3D4:bp9~8U5jbM3Ja)bf9_bKbi55bNa;bU3D55bSbm5jb%bX8Fbh1{5y5lb(bq6i5lb-7.5#b_3+ab6~3vaZ019s7FaT5V7a042A0v9B0Dc69Fc6ah9.ama*aP9XbCb19Jco3Ocq2-b0aUbdca9W0^9?a(b=b#b@6w5Ablb 8V5z7*a3bT915jcO2G9aaabbbEaiakaNcu9EaqckctbZbD7o0K7Dcrczcmcic)cBaJcAc%cCa#aI9q8.c atc?c_9;c^c|c`avd8d6a#c:cxagaKc#cnc,cpd7dkczb5dbapc~cFaTb?0I5y7!2}bOb*6w1~b~bPdCa7bYbIbgcHdw6w8Ldzb)cS5y8Q8ScR97cT8X3jdI6VdK6,8|0u8~dPb{5@cPa_cMcT8~6`cY9f6 c6c8ckcc1:0R8{372A2Cd5dr9*dn5VdhaMdjdJcY7Na%6odudL65a:d,cNa1dUb.ejcVa8buc39g9ic;e89td20:9r8$eA3P9!9A1zche4a!e6ecbD0I9!9$eKaQ9)c*c!eac@040PcEegcudv5ya|d+dVa56jd.elcTa|bta9dg9t8z0R8gb47j0SeEb8eEah7c2s0R19e}7keScjeSclaLaleYde3lcyeydpe7c}0PbHd#b!d%bi6xeke,7(fudEdB3dbscWa~e^cecgeYeMfqeOe9fffa0^fh3Lfj7te_8Af8e fO04fQ2FfSc`fleNdleZfp2G6X6D6R6F6O1b0x6If?2M2Hfe2G6G7R0Z0#0%0M04.

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
.128013oIPf 8lkg5:+bry2a1}h3tvw=u6{e[(Sn]_s-c)7im/4pd050U0D0w0r0P0h0K0f0M0h0r0K0K0z010w0P0T010406050K0A0Q0Q0r0o0p040G0b0h0A0/0b0H050R0_0{0}0 0@0T04051f181i0R1f0@0U0P0x0%0)0+0-0)0H0j0A0r0j0D0L0T0p0w0u160f0u0P0j0u0h1K0u0w0=050Y0n0h0D1r0*0,011J1L1N1L0w1T1V1R0w0o1g1F0%120K0T0r0H0-0q011X1t010e0!0D0H0r0Q0D1R1?1^1}1Z201V23250=0a0f0d0o0b0T0b0K0P150H0f0W1;0o0o0D0M2q18280H1g0R1F2D1-1/1.1S0U2a1u0P0H222n1R1o1q0(1Y2N2P0H0b2T1R0T2w1g2B2D2*0^1@2r2V1~2Z0o0|0h1R0r1I2w0e0-030J0J0M2!0D1N2Y0b0L0O0L0s0=0s180r2+2.0?2-292:1Z2=2@2_2{0D2}012 3133352Q380L1{040q3e3g1^3i2B2M013n0r2^1g2`0u2|2~30320W3x2Z3z0v0=0v3E2A3h0@3I3l0-3L3N053P3R3t3T3w2O3y390S0=0S3$193(3j2/1s3m0b2?3M3p3Q3r3S3v3V3^3X390k0=0k3~2*3)2.3J3-483;3u3U344e37390B0=0B4k403*433,453o3O3q3s4s3@363z0O0=0O4B3G4m3k4E3K4G474I494K3?4d4N390g0=0g4S2C1j2(182T2G0U1/2L3+014t2S1p1g2%0D2)3h3%3G054t53290P0U0-302B3z3b4I5b5d4c4u4)3a1|2e0D5k4t3W4w5o2D3f413J0i0=0W0e554/4D2W010y0=0f5F59425I0H0e0=0b0M0M0A2v220M0D310}0r2y0D2w0K5N5z4{0;040F5-5H2;0=0T3Q0*0D5?4n5/0=0N0l5N0@3 563I5j015e2.3z3B3/0f694%5m3_3A5p245r6a5l5u6d1R0R3f0f6w5M5@3m5T5V5X2w0H5!5,662C6y5 4W0b0=0z5N6K4V5I5:0C0t6Q5.4W0M5h030f0c0H2p0P3M0P0K0r2q2s000A2r1o2y0P16230P2w0f0x5b5}6I3i735z6h0J5f393Z5i5c6p5t4v3Y6m255s4M6k7b3E6x6R5P1~5B040e456X6z3,0=0M5%5)2w7x6L5I0b5K042O7F6S5^045`0o5|5~7N1Z5:6373652,687d6b1^3z3{7c7k4(6k3{0f5q7,6j4f0L7*7o7p6x6Y5I7t0P5E737q4o7A7C0w5*722*834{7I0=7L827}7O5U5W5Y6F0D6H7!7G1~7W647T2r77790L4h7+7e7l7@4h7:6n7=6r4g6t6v7{8M8h6A048j6D5Z8n8u3J5:0E8V4{0H857R7D89547y015:0I7M7r1Z6N040m6P8g8+0Q0P3c8t757#5k8x4y8A6i8I0L4y8F7j8B7-7@937`8N8+7t340K8)678q7V0=7X4l8V8w6c394P946q7g9v7i6o959z388K048M9g9n7z8Q6C8l6G8Z4W8X9Q5Q8$5(877E8 9K8,0=8.8_9!8=8^8a8O0-8{8}7Y9s7$789u0L4+9x7f5n4+999C9y9}9G7p9-017t2w0w5X179(7U9L8R9O8U9;750R584:524=4 180w4^aq2J2E0r1Uan0R4?650W0Y0!0K04.

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
.128013oèPf8gbr1ûa3tv=uàn9xsc)7qR/p0dI; lk5:j+,y2éChw6e[(ES]_Lim.4-050E0W0n0l0(0I0v0H0w0I0l0v0v0p010n0(0C010406050v0q0)0)0l0i0P040!0b0I0q100b0s0H020l0)0C0G0H0A0W1a0i0z0q0W0v050B17191b1d150C04051I1B1L0B1I150E0(0o0^0`0|0~0`0s0g0q0l0g0W0,0C0P0n0T1k0H0T0(0g0T0I1;0T0n13050:0h0I0W1U0{0}011:1=1@1=0n1}1 1{0n0i1J1,0^1g0v0C0l0s0~0Q01211W010e0=0W0s1o0W1{2j2l2q232t1 2w0)2y040a0H0d0i0b0C0b0v0(1j1l0.2h0i0i0W0w2T1B2A0s1J0B1,2)2d2f2e1|0E2C1X0(0s2v2Q1{1R1T0_222?2^0s0b2|1{0C2Y1J2%2)39162k1l2~2r320i1a0I1{0l1/2Y0e0~030$0$0w330W1@310b0,0j0D3A130H0j1B0l3a3d143c2B3f233h3j3l3n0W3p013r3t3v3x2_3A3C2o040H0Q3H3J2l3L2%2=013Q0l3k1J3m0T3o3q3s3u0.3!323$0,0m3E0m3,2$3K153:3O0~3?3^053`3|3W3~3Z2@3#3B0,0+3E0+481C4a3M3e1V3P0b3i3@3S3{3U3}3Y404n424p0K3E0K4u394b3d3;4f4E4j3X3 3w4K3z4p0V3E0V4Q4w4c4z4e4B3R3_3T3V4Y4m3y430y3E0y4+3.4S3N4.3=4:4D4=4F4@4l4J4`4p0f3E0f4 2(514y2 544C4g4i4G4k4I4!5c3C0t3E0t5h3/4T4d5m4;4h4?4H4Z414$3C3B133B5z5j4U555o5G5r5I4#430j0j5N3G0B3I49504x5R5n4W5q4^5b4o5L3(0j3+5%3-5i5+5C4V574X5a5t5=3A45040j475`5)5|4-5l5 5F585H4_640j4r674t6a4v5*6d3g5S5.595s5J5Y4N674P6p3b1O371B2|2,0E2f2;5C4Z2{1S1J360W383K6b1J4Z6U2B0(0E0~3s2%5Y3S6#6%6x5X4p5!0H2G0W6-5W5u3D2)5(6s3P130d0F0Z0S0Z0!6W0H5}530b130p77795l12040X6W7f2r0)0(5N0D0D7k6~0~7h0O7e7t017n130K7r6q2(7l237v7x5B537A040Q7D3b7y7I7E3)7G0~7M5O7T7V017S39787y7M6C7Q7K7g137w7T7(7-7m7o7N7s7?7H7/7J525l7X7`7 2r7h0#6W157Z3:6,016(3d433(5F8b626y4p2o6=2x6^6j4L3%1{5`887,6!6$8c0$6)4p668h8y8j6/3C458n2H8p5;8r448t3I8v6V8a8F8A8e4p6m8E8M638O4r8K6@8z6_648Z6a7y0J130.0e825k2r0U3E8^4U0e132Y0s0E0q0$0)1k2w0(0W0$2Y0w8}5C7h0Y9e530s130l9b2v0E2Y9i7.047:7%7!9k040(9r84130x0L878}8i8W2l436A8!8+8q5K0,4N8)8#8k3C9L5`0H9Y7=83238;9y8@7;9w9l9n929q9*7y7b040p7d9:7{7W7^7P8T9`7#139E7T8S3.5+9H8B3C4(4=9H8,8O4(9S9N8N9Paa3,9Zam9!8_9$900/0q0i0s7~ap7u130X86a39G8Va80,4|ab8Vad9P4|ag8G6`aHal9Z9+040Caw3;9=9^9v7y9x7173759A7|7ia*4e139z899 859Fa;8x6-aF5eaI9T8H0,5eaN6.6`a|aR9Y7!9%0(9)a!9 9xaV9_9#0~9=020I0n0GaZ3Kao4U9,919p0Wa-a004a24RaDa`8X5v6+aJ9O435wb2aKbI8Q3)anb78:ar0natavbgaxbx7ja^bXbebwa?bWaX130NaW5~ar9294960s989a9cb%139hb!br049mbt9/bcbh019=0,b-9j13bf8wbX7$bpaTa:cc3;7h0xa@cia7bD3$bFa~6`5MbKbH6:0DbNamb8133w0vbvb}9fa1cm9~a_8zaF5Zcrah8$9PcOcvai5Y5!6|bObPcB042YbTauc86eb/9395970;b^2Zb`04b|cib.b 9-buc?9ucfa#a/c*2r9=b,b)5C81cG53ckcJa58UbC9J6:8g3maccw5?2p6?cs6k8g8ubBcMcp68cPaO6k8JdpcQ9U65bNa47Fdfdvdh5L8ZdkbGcV6:8(dCdz8O6lbNc#8?bw8{7Uda6e8 c$9ob;c/99c?c^cKb#bs9oc2d;cj9Cbz4wb}codL3A9LdOdqdV9RdTb36k9W3IcAbRd*c(bVc3d=d*b:c.b?c:9n9dd%9Bc@bw9xc0d@cFc_db7}d77L9|c?claC7Z0B6Y1M6G0B6I1B0n6KeO2/2*0l1~6T6H6Q1H6ZbX2Y0)0$0e0l0J9a0T661t1v1x1z0Hd|a51O3L1I0%3m0o0W0i2R1.360RcE0s0n0R200E2l0@0`2W9c2T0H1z0n0^3w1 0H0le~0w2h0s0w0lf72w2T0*060%203u0kfj2Vfi0H1x0l9pfu0(e;0O0H0r0^0l0qcE0H932hfD0H3x0R0;2YfV20fd3ufsfu0Rfw0(1kfy0F0I0He)1ifh1l3U0e0/fO0I4B0@2V0w0T0le;fn0C0C3w0H0i0R0wat2R0efO9c2O990ifZ002vcE0)eVf(0@0o3@0Wghgv0H0C0(0c0we=0E0R0MfQbt1y0v0*1Me`04f?0Hgxf`7ngz0ufh0|0l0Pe f(f^f$f)e}e f11lfo2Z784Z3;1Y1!1$1(1*1/1^271_2zbd9lga9o7keI3v3)2Pat0H0b0h0n2v0(go0q3e0bfYf!g+gPe_880.0:0=0v04.

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

.128013oPf 8lkg5:,Fbry2a1}h3tvwT=u6{e[(Sn9]x_s-c)7iqm./4p0d050!0E0w0r0S0g0N0e0P0g0r0N0N0A010w0S0Y010406050N0B0U0U0r0o0p040H0b0g0B0^0b0I050W0 1113150}0Y04051l1e1o0W1l0}0!0S0x0-0/0;0?0/0I0i0B0r0i0E0O0Y0p0w0u1c0e0u0S0i0u0g1Q0u0w0{050(0n0g0E1x0:0=011P1R1T1R0w1Z1#1X0w0o1m1L0-180N0Y0r0I0?0q011%1z010d0*0E0I0r0U0E1X1|1~231)261#292b0{0a0e0c0o0b0Y0b0N0S1b0I0e0$1`0o0o0E0P2w1e2e0I1m0W1L2J1?1^1@1Y0!2g1A0S0I282t1X1u1w0.1(2T2V0I0b2Z1X0Y2C1m2H2J2:0~1}2x2#242)0o120g1X0r1O2C0d0?030M0M0P2*0E1T2(0b0O0s0v3e0{0e0s1e0r2;2@0|2?2f2_1)2{2}2 310E33013537393b2W3e3g21040e0q3l3n1~3p2H2S013u0r2~1m300u323436380$3E2)3G0O0v3i0v3M2G3o0}3Q3s0?3T3V053X3Z3A3#3D2U3F3f0O0X3i0X3/1f3;3q2^1y3t0b2|3U3w3Y3y3!3C3%413)430j3i0j482:3=2@3R3_4i3}3B3$3a4o3d430C3i0C4u4a3?4d3^4f3v3W3x3z4C403c3*0R3i0R4L3O4w3r4O3S4Q4h4S4j4U3 4n4X430f3i0f4$2I4(4c2$4+4g3`3|4k3~4m4E4?3g0J3i0J4{3P4x3@504R3{4T4l4D3(4G3g0s0Z0{5q5d4}4y4,525k555m4F3*0s0s5s3k0W3m3:4%4b5w514A544V4=425p3I0s3L5I3N4|5M5g4z4.4B4;575T3G5s3.5Y5K5!4N4 5%5j4/5l4W5,0s45045~5u5#4*5^534:565n5D4r604t5:493O1p2.1e2Z2M0!1^2R5g4D2Y1v1m2-0E2/3o5;1m4D6w2f0S0!0?362H5D3w6D6F685C435F0e2k0E6L5B583h2J5J5?240h0I0{0d2q0U6y634 0y3i6+6Z3t6$04380g1#2E0S1c0N6:5f4*6.3J6 4)4 6#0{0S0U2s0o0w6y0e6,2`0{0$0T0B0E6y0}6f2I5M6K016G2@3*3I5j7s5*6943216Q2a6S7t6M6V7x5Y7o2=3Q7z0M6H433,4S7P6U5,3,7E2b6T5|4p3g7T3/6;0?0h7i3y744~24727f7p6B7;3t0d0{0E0L0S0N0w0E370u0E0U2U7:3R0`040G895$0{0i0o0r0Y858e4*8b0l7e7g3t7.1}7c8m4 8o8q7+3S0{130o1v0E7m7^8r0?8b0Q0k7n897P7R3g5 7y6E7H7W7%44226R7#5S8Y8T5Y0e8+7f8A6?0Y278z704 0b0{0A8=757h047j7l8w248b0G0Q8O8I7O8V7u1~3*6b8U8$5+8Y4r7Z7G7A6N3g9d8*8,8J8B040x802v0E6~7^8-8?248^048`9z9r8b0D0t967N4x8Q7v4H6J997I5,4I9j9f7B3g4I6X3J9q8.0{8:1#911)9D0V9,3^8C0Y0Y280!9:01939`6?0$8u7d979B1)8L9L6x986L8R0O4Z7U9S8X5oab8!7F9X9mah9#8,9A8|1)7-040y1P9+9G8A0b722)a12:ap7`9;049*8H9Maq0?9.9}7}810M9u0$9`938Ma66ga87Haa4^adak6V4^9W8W7$aga$3Maoao9r6?380B8i0IaC3oaE3R9D9FaDa?9)8;a2aL01aNb6aF9s2s0YaU0{94aX7qaZ9a0I3*5aa%a,8%ag5aa+9l6Vboa:a;8+9ras0S0d8{bb6?8D8FaJa}9raz781daxa3aG8h8j8lba8a0{0FaO6@0ba_1~a|aYbR9{0{0K8N7^7Ma79N9Saa5q9Ra(5}5rbu9T8Yb_anbza;bB0{2C0wa_bPb28A0h0P0{0z0o90b:8Pb@9P5p5Fbpbv5}6P8#bq9gag5E1X9pbzc5040d4fbF4y7}0(9@cF5gbN0488bQb76?bT8kbKb*b78bbZbW8fb#b%a{bf04b.bi7_0e9O9b6O7x307Va-5D7Dctcqc07K3mc3c4cc78bEcPbbcMaBcK64cH8jcU2Ia~cL72cOcbb+6?9u2u829yaKbb8bb/4vcka9cm5-cpb cw7Yc`dz5D7)czc d0djb4awdpa 0{9/cZd9048j9@0I9_dQ8xbgb!0%dbc(95cjbWc.bm6O8Tc=aec@d-ai7!cu9Y3e8)c~dHcA9(9t9vdnc(cYdMc!d#cJdX92b-d88@8_ec6!ce04cgcidtd*clc/5p9dd/b{c09idCaf6acyd|bAd104c7c9efareh0m3U0Ndc3p8I0W6A6h6v6j6s1e0w6meU2P2K0r1!eR0W6k7o0$0(0*0N04.
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

.128013oPf lkg5:,Fbry2a1h3tvwT=u6e(Snx_s-c)im/4pd050Q0B0u0q0L0f0H0e0J0f0q0H0H0y010u0L0P010406050H0z0M0M0q0n0o040D0b0f0z0+0b0E050N0=0@0_0{0:0P04051b141e0N1b0:0Q0L0v0Z0#0%0)0#0E0h0z0q0h0B0I0P0o0u0s120e0s0L0h0s0f1G0s0u0.050U0m0f0B1n0$0(011F1H1J1H0u1P1R1N0u0n1c1B0Z0~0H0P0q0E0)0p011T1p010d0W0B0E0q0M0B1N1/1;1_1V1|1R1 210.0a0e0c0n0b0P0b0H0L110E0e0S1-0n0n0B0J2m14240E1c0N1B2z1)1+1*1O0Q261q0L0E1~2j1N1k1m0!1U2J2L0E0b2P1N0P2s1c2x2z2$0;1:2n2R1`2V0n0^0f1N0q1E2s0d0)030G0G0J2W0B1J2U0b0I0r0A340.0r140q2%2*0/2)252,1V2.2:2=2@0B2_012{2}2 312M34361@040p3a3c1;3e2x2I013j0q2;1c2?0s2^2`2|2~0S3t2V3v0I0t0.0t3A2w3d0:3E3h0)3H3J053L3N3p3P3s2K3u350I0O0.0O3Z153#3f2+1o3i0b2/3I3l3M3n3O3r3R3=3T3@0i0.0i3|2(1h2!142P2C0Q1+2H3(013Q221c4n1d4l4j2(4u2#2*0e0L0Q0)2|2x3U0r3l4G4I4a304c333@4M0e2a0B4P4u3S4T364M2z3b3 3F0g0.0S0d3!3C4+4s0w0.0e4;2y4?413)0d0.2~0E0+1~0u2}0o0!0B4{4D3g4~010-040C5b4}2S3G0.0h0n0q0P0s5a3}4=3%5e5g0K0j5b0:5u4|3E4O014J2*3U3x3,4F4H5H4Q4#5K1^4X4Z3;325S4)040e5#4`5w5l4-040d435b5%4E4s0E0.1J0B0z5.5k1`0b4^042K5`5(2-5n5p5r5t2(621V5g5A5D3e6d4+5G5I1;3U3W3K5N5V4b5X3@3W4W204Y5P4!4S6k1N0N3b5$6D5/5d5)0.0L4:6d6F405l5=040B0F0L0H0u0B2}5s0M606f690)5g5i6#5:5e6P5o5q5s5j6$5f0.0k616+6O5?0L5^6;6`1`5g6^6L5{3i6|6~6*6G710.5z5B6 256h0G4K3@3_6m7h6x6q363_6t216o4R7p3^6A6C6E7A750)5*2s0u0z0n13746=0g0J0.0x0n0z673~792n7h7j364f7m5O3:6p3?7Y5T6u7u5R4e7y5!5$7C017E0T7H7J2$6M4,7N040l3I0H7S3C5C4j4C1f4l0N4x2A4p142D8e0q1Q0B2z4n5C0S0U0W0H04.