Diagramme en barres

Plusieurs fonctions

Cet exercice est en plusieurs parties.

Vous pouvez traiter celles-ci dans l'ordre que vous souhaitez.

Il est possible dans une partie quelconque d'utiliser les fonctions demandées dans les parties précédentes même si vous ne les avez pas écrites.

On souhaite construire un diagramme en barres à partir de deux listes :

  • une liste categories contenant des chaînes de caractères,

  • une liste valeurs contenant des nombres entiers positifs ou nuls.

On garantit que les deux listes ont la même longueur.

Si l'on prend par Exemples :

  • categories = ["Anne", "Luc", "Patrick", "Sam"] ,
  • et valeurs = [10, 8, 5, 15],

on souhaite obtenir :

🐍 Console Python
Anne    : ##########
Luc     : ########
Patrick : #####
Sam     : ###############

La construction de ce diagramme passe par plusieurs étapes détaillées ci-dessous.

1. Longueur maximale

Comme on peut le voir, afin de construire un diagramme convenable, on doit faire en sorte que toutes les « barres » débutent au même niveau. Il faut donc compléter certaines catégories avec des espaces. La taille commune visée est la longueur maximale des chaines de caractères présentes dans categories.

Écrire la fonction longueur_max qui prend en paramètre une liste non-vide de chaînes de caractères et renvoie la longueur de la plus grande d'entre elles.

Exemples
🐍 Console Python
>>> chaines = [""]
>>> taille_max(chaines)
0
>>> chaines = ["Toto", "Titi", "Tata"]
>>> taille_max(chaines)
4
>>> chaines = ["Riri", "Fifi", "Loulou"]
>>> taille_max(chaines)
6
>>> chaines = ["Pomme", "Abricot", "Poire", "Pêche"]
>>> taille_max(chaines)
7

###(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 : 10/10

.1280135tf4)2r3sao iug0xm1P6pnl7he=cy:v(w;S/b_dk050O0B0c0k0n0y0j0m0D0y0k0j0j0C010c0n0w010406050j0o0s0s0k0h0E040K0l0y0o0*0l0x050L0;0?0^0`0/0w04131a051d0L1d1f1a0/0O0n0G0Y0!0$0(0A0n0p0A0y1t0A0c0-050T0M0y0B1o0#0%011s1u1w1u0c1C1E1A0c0M0l0O0`1B0h1b0c0A0Y0}0j0w0k0x0(0g011G1q010d0V0B0x0k0s0B1A1(1*1/1I1=1E1^1`0-0a0m0u0h0l0w0l0j0n100x0m0R1$0h0h0B0D2f131}0x1b0L1!2s0c1Y1X1Z0O1 0(1w0x1@2c1A1l1n0Z1H2C0n2E0x1U1m1A0w2l1b2q2s2W0:1)2g2K1:2P0h0@0y0-0t2p2!0.2Z1~2$1I2(2*0-0g2.1*2:2q2B012^0k2+040i2|2r0/2 2?0(32340e372~2!303d0-0b3g393i3b310l2)330-0v3n2;2#1p2@3s2_040z3g1c2U132I2v0O2z300D1U1{1b3K1e3I2Y142/053P0R2V3p3A0(0P0-0R0d3G3a3(010I0-0m3.3%2L310d0-0y110p0o0B0o0h0N0@0r3^2=3:0,040H483z3`0x0-0D0A0U2E0j4e304b0f0F3n0m4u3@3/4g0-460n3g4w3_1:0l0-0C4C3y300s0n0-0q4t4v4K3q3*040d3s4J4x2%0-0c0B0r4$4Y4E1I0l3=042N4*494y044j4l0B4n3X2}4S4a0-4s4|384v544D4=1:4U0n3-5204564f2%0M3}1@4o3q4b4d5c4~4?4$4(0B5k4 040f4;5f4,0-020p0c0J5y3j4z0k0r4B5o4Z1I4b512W06555T5e5H044A5G3q4G044I5c5V3q0x5h04225u3`5m5/4!045r4)5M4+0(4q3n5S4R5N3)0-2l0c43125(5p5?5Y5c0/0L3!0B2s2T6g3J1m3L2v2x2t1T1V2v0k1D6j0L3K6d0R0T0V0j04.

###(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 : 10/10

.1280135tf4)2r3sao iug0xm1P6pnl7he=cy:v(w;S/b_dk050O0B0c0k0n0y0j0m0D0y0k0j0j0C010c0n0w010406050j0o0s0s0k0h0E040K0l0y0o0*0l0x050L0;0?0^0`0/0w04131a051d0L1d1f1a0/0O0n0G0Y0!0$0(0A0n0p0A0y1t0A0c0-050T0M0y0B1o0#0%011s1u1w1u0c1C1E1A0c0M0l0O0`1B0h1b0c0A0Y0}0j0w0k0x0(0g011G1q010d0V0B0x0k0s0B1A1(1*1/1I1=1E1^1`0-0a0m0u0h0l0w0l0j0n100x0m0R1$0h0h0B0D2f131}0x1b0L1!2s0c1Y1X1Z0O1 0(1w0x1@2c1A1l1n0Z1H2C0n2E0x1U1m1A0w2l1b2q2s2W0:1)2g2K1:2P0h0@0y0-0t2p2!0.2Z1~2$1I2(2*0-0g2.1*2:2q2B012^0k2+040i2|2r0/2 2?0(32340e372~2!303d0-0b3g393i3b310l2)330-0v3n2;2#1p2@3s2_040z3g1c2U132I2v0O2z300D1U1{1b3K1e3I2Y142/053P0R2V3p3A0(0P0-0R0d3G3a3(010I0-0m3.3%2L310d0-0y110p0o0B0o0h0N0@0r3^2=3:0,040H483z3`0x0-0D0A0U2E0j4e304b0f0F3n0m4u3@3/4g0-460n3g4w3_1:0l0-0C4C3y300s0n0-0q4t4v4K3q3*040d3s4J4x2%0-0c0B0r4$4Y4E1I0l3=042N4*494y044j4l0B4n3X2}4S4a0-4s4|384v544D4=1:4U0n3-5204564f2%0M3}1@4o3q4b4d5c4~4?4$4(0B5k4 040f4;5f4,0-020p0c0J5y3j4z0k0r4B5o4Z1I4b512W06555T5e5H044A5G3q4G044I5c5V3q0x5h04225u3`5m5/4!045r4)5M4+0(4q3n5S4R5N3)0-2l0c43125(5p5?5Y5c0/0L3!0B2s2T6g3J1m3L2v2x2t1T1V2v0k1D6j0L3K6d0R0T0V0j04.
2. Allonger les chaînes

La longueur maximale de la chaîne étant connue, il faut désormais ajouter le bon nombre d'espaces aux différentes catégories.

On demande désormais d'écrire la fonction allonge qui prolonge une chaîne de caractères mot avec des espaces jusqu'à ce que sa longueur soit égale au paramètre longueur (entier strictement positif).

Exemples
🐍 Console Python
>>> allonge("Anne", 7)
'Anne   '
>>> allonge("Luc", 7)
'Luc    '
>>> allonge("Patrick", 7)
'Patrick'
>>> allonge("Patrick", 1)
'Patrick'

###(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 : 10/10

.128013tf)+2r,sa-o iugm1Pp*nlhe=cy:v(wS/bdk050J0y0b0j0n0w0i0m0A0w0j0i0i0z010b0n0t010406050i0o0q0q0j0g0B040G0l0w0o0#0l0v050H0,0.0:0=0*0t040~1505180H181a150*0J0n0D0T0V0X0Z0x0n0p0x0w1o0x0b0(050O0I0w0y1j0W0Y011n1p1r1p0b1x1z1v0b0I0l0J0=1w0g160b0x0T0^0i0t0j0v0Z0f011B1l010c0Q0y0v0j0q0y1v1Z1#1*1D1-1z1:1=0(0a0m0s0g0l0t0l0i0n0{0v0m0M1X0g0g0y0A2a0~1^0v160H1V2n0b1T1S1U0J1`0Z1r0v1/271v1g1i0U1C2x0n2z0v1P1h1v0t2g162l2n2R0+1!2b2F1+2K0g0/0w0(0r2k2V0)2U1_2X1D2Z2#0(0f2)1#2n2O0y2n2D2q0J2u2w010A1P1?162}192P2,2m2@3b330M2Q2V310K0(0M0c3c3g2-1k1D0F0(0m3n3a310v0c0(0j0w0w0|0p0y3v2l310%040E3H3h2.0Z0v0(0q0l0b3N3p2G013K0h3n3u3I3P013R043D0v0p0o0y0o0g3W2W3q0Z3K0d0C3n060m403%3O3_013j042g0b3=0}0 2*423X2Y3S3U3$3w3)0l0(0e4j3(440i1(041)014p433Y4m040u4x4f1D3K3M4c2^4k443+3-3/3;3?4I2m4e3^4z0(0k4D4U2Y0I0(1}3@3J0(4H2T4q3Y3+3T3V4R3o4Z4F0(0d0d3~0~3e2{17390H372o2 0~2r2q1O1Q2q0j1y4 521h2+520N0P0R04.

###(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 : 10/10

.128013tf)+2r,sa-o iugm1Pp*nlhe=cy:v(wS/bdk050J0y0b0j0n0w0i0m0A0w0j0i0i0z010b0n0t010406050i0o0q0q0j0g0B040G0l0w0o0#0l0v050H0,0.0:0=0*0t040~1505180H181a150*0J0n0D0T0V0X0Z0x0n0p0x0w1o0x0b0(050O0I0w0y1j0W0Y011n1p1r1p0b1x1z1v0b0I0l0J0=1w0g160b0x0T0^0i0t0j0v0Z0f011B1l010c0Q0y0v0j0q0y1v1Z1#1*1D1-1z1:1=0(0a0m0s0g0l0t0l0i0n0{0v0m0M1X0g0g0y0A2a0~1^0v160H1V2n0b1T1S1U0J1`0Z1r0v1/271v1g1i0U1C2x0n2z0v1P1h1v0t2g162l2n2R0+1!2b2F1+2K0g0/0w0(0r2k2V0)2U1_2X1D2Z2#0(0f2)1#2n2O0y2n2D2q0J2u2w010A1P1?162}192P2,2m2@3b330M2Q2V310K0(0M0c3c3g2-1k1D0F0(0m3n3a310v0c0(0j0w0w0|0p0y3v2l310%040E3H3h2.0Z0v0(0q0l0b3N3p2G013K0h3n3u3I3P013R043D0v0p0o0y0o0g3W2W3q0Z3K0d0C3n060m403%3O3_013j042g0b3=0}0 2*423X2Y3S3U3$3w3)0l0(0e4j3(440i1(041)014p433Y4m040u4x4f1D3K3M4c2^4k443+3-3/3;3?4I2m4e3^4z0(0k4D4U2Y0I0(1}3@3J0(4H2T4q3Y3+3T3V4R3o4Z4F0(0d0d3~0~3e2{17390H372o2 0~2r2q1O1Q2q0j1y4 521h2+520N0P0R04.
longueur_max et allonge chargées !

Il est possible dans la prochaine partie d'utiliser les fonctions longueur_max et allonge même si elles n'ont pas été complétées précédemment.

Une version valide de chaque fonction est déjà disponible dans l'éditeur.

3. Le diagramme complet

Il s'agit donc désormais d'écrire la fonction diagramme qui prend en paramètres la liste categories contenant les noms des catégories et la liste valeurs contenant les entiers associés à chaque catégorie.

Cette fonction renvoie la liste des chaînes de caractères correspondant aux lignes du diagramme.

On garantit que :

  • les deux listes ont la même taille ;
  • les deux listes sont non-vides ;
  • les valeurs sont toutes positives ou nulles.

On notera que dans les règles de typographie française, on ajoute une espace entre la fin d'un mot et les deux points. On écrit ainsi Patrick : et non Patrick:.

Exemples
🐍 Console Python
>>> categories = ["Anne", "Luc", "Patrick", "Sam"]
>>> valeurs = [10, 8, 5, 15]
>>> barres(categories, valeurs)
['Anne    : ##########', 'Luc     : ########', 'Patrick : #####', 'Sam     : ###############']
>>> categories = ["A", "B", "", "EEEEE"]
>>> valeurs = [1, 1, 0, 5]
>>> barres(categories, valeurs)
['A     : #','B     : #', '      : ','EEEEE : #####']

Les affichages des résultats sont toutefois plus lisibles en procédant ainsi :

🐍 Console Python
>>> categories = ["Anne", "Luc", "Patrick", "Sam"]
>>> valeurs = [10, 8, 5, 15]
>>> for chaine in barres(categories, valeurs):
...    print(chaine)
...
Anne    : ##########
Luc     : ########
Patrick : #####
Sam     : ###############

Compléter la fonction barres ci-dessous :

###(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 : 10/10

.1280135[tf4)+2IrR3,sao iug0x8m1]P6p*nl7h.e=céy:v9(wq;S/b_dk050!0K0d0p0s0G0o0r0M0G0p0o0o0L010d0s0D010406050o0t0y0y0p0k0O040W0q0G0t0_0q0F0r020p0y0D0V0r0l0K130k0U0t0K0o050X101214160~0D041u1B051E0X1E1G1B0~0!0s0Q0.0:0=0@0I0s0u0I0G1U0I0d0|050)0Y0G0K1P0;0?011T1V1X1V0d1%1)1#0d0Y0q0!161$0k1C0d0I0.190o0D0p0F0@0i011+1R010e0+0K0F1h0K1#26282d1-2g1)2j0y2l040a0r0B0k0q0D0q0o0s1c1e0%240k0k0K0M2G1u2n0F1C0X222S0d201 210!2p0@1X0F2i2D1#1M1O0/1,2$0s2(0F1|1N1#0D2L1C2Q2S2}0 271e2.2e2?0k130G0|0r0z2P310}302o331-3537390i3c283e2Q2#013j0p38040r0m3n2R0~3q3h0@3t3v0r0f3z3p313r3F390b3J3B3L3D3s0q363u390C3Q3f321Q3i3V3k3w0H3!3C3%3E3)3X3w0x3-3S3/3U3W3G0R3^3g3`3N040z0v3J1D2{1u2,2V0!2Z3r0M1|2v0$1N1C2`0K2|3d464f0%4n402/010#0|0%0e463.4u0T394A3_4u0F0e0|0Y142L1t1v4o4B2e0{040S4F4t340|0M0p0d0K0u3V0s1s4W3$4u4T0n3J0r3#3M0|0Q3u0K0t0k4O2 4R1-4T0g0P3Q0r564=503E0|0G1d0u1r4|4;4?3T0q0|0L5h593s5b5d5f0k0Z130w4,3r4T4V4P3o5i414Z4#4%4)4+5B2R5D4.0|0g55575M4Y041M0p0u0k1h2u5n4G2e5k045m5K3w5S510|0c0A5Q565-0@4w040e3V5#4X3i0|0s5}4-5%4D042;623M0Y0|5Y0F0u0K5x3T5z6g416a042s6j5N4U6o5T4!4$4(0k4*4~4Q5$5.040g535=575?5o0F5b1U2(685j5l6N5E043u5c6d6f5+5@016i6X6I5F6u5I6y5C5o4T0c6r5 666/0@4T0A4:5+586A5a6m5r4{0k6=6Z5O6F6G6Y6J6m6L6W2}6{5~0@5(0h5*7c6Y0o2b042c0P0r01755R6$790u6M6`6Y7g7i3d7d631-7l0|01037r7y5o5(0E6Q4H4^4`4|6*5L6,5/7278616#6|73045;5+066G767u5V5X5Z7b6z7e015(0J7Y0|0p0D0D2i0!726!4 7$781;7x847@523Q7+7t7$5_2L0d4|0F7P5T7/5Y127=3o0~0X4q4m478v0X4a1u0d4c8A2X2T1{1}2V0p1(8x4a1A4s7E0@2L0y0Z0e0p0#0K0Z0I0m0|1m1o1q1s0r546X1H3e1B0j0G0r1s0d0r0p0t0=0s0r2C8{8K0r2I0M0k0N0K0k0r1)910s5W8o2u8=1e1b0+0s0o288@0t2(989j4$9f241i940I2i2E1d8*1D3e2,3r1/1W1Y1!8O3r2r2i2k0|2x0W930`8@0B0O221d464l8O2~4o8u9J3T5_4y72654=7#7@4I4K4M5J898P7%5A9^4@046t5H6w9@7?9_4/8l6:4_1)7T825O8+2}8d6H850|0)0+1)a67f6P7Lah6~6d5s5u0p5w9/a40|9{a39}9 6v6xab6C6F6Y8g0(8jam7%6.ax9}6T5d8q7V7$83aB3T78aD6)aGaP9|aZ60aG6^aN78aj0GalaQ6h74ap7@7gaN7G7n8*7qaNa{a_9_a}7I7K7j7M0|7Ob39}a8707U9(3`6-7{6;a?bi0|7)b88f0|5{71bca*blbqa`6567bv6k6b286eaGaA6+856l6nbm6pbIaV9:6%a0aFbN4S5O0gbp3d8s9%8w2S8M490(0*0,04.

###(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 : 10/10

.1280135[tf4)+2IrR3,sao iug0x8m1]P6p*nl7h.e=céy:v9(wq;S/b_dk050!0K0d0p0s0G0o0r0M0G0p0o0o0L010d0s0D010406050o0t0y0y0p0k0O040W0q0G0t0_0q0F0r020p0y0D0V0r0l0K130k0U0t0K0o050X101214160~0D041u1B051E0X1E1G1B0~0!0s0Q0.0:0=0@0I0s0u0I0G1U0I0d0|050)0Y0G0K1P0;0?011T1V1X1V0d1%1)1#0d0Y0q0!161$0k1C0d0I0.190o0D0p0F0@0i011+1R010e0+0K0F1h0K1#26282d1-2g1)2j0y2l040a0r0B0k0q0D0q0o0s1c1e0%240k0k0K0M2G1u2n0F1C0X222S0d201 210!2p0@1X0F2i2D1#1M1O0/1,2$0s2(0F1|1N1#0D2L1C2Q2S2}0 271e2.2e2?0k130G0|0r0z2P310}302o331-3537390i3c283e2Q2#013j0p38040r0m3n2R0~3q3h0@3t3v0r0f3z3p313r3F390b3J3B3L3D3s0q363u390C3Q3f321Q3i3V3k3w0H3!3C3%3E3)3X3w0x3-3S3/3U3W3G0R3^3g3`3N040z0v3J1D2{1u2,2V0!2Z3r0M1|2v0$1N1C2`0K2|3d464f0%4n402/010#0|0%0e463.4u0T394A3_4u0F0e0|0Y142L1t1v4o4B2e0{040S4F4t340|0M0p0d0K0u3V0s1s4W3$4u4T0n3J0r3#3M0|0Q3u0K0t0k4O2 4R1-4T0g0P3Q0r564=503E0|0G1d0u1r4|4;4?3T0q0|0L5h593s5b5d5f0k0Z130w4,3r4T4V4P3o5i414Z4#4%4)4+5B2R5D4.0|0g55575M4Y041M0p0u0k1h2u5n4G2e5k045m5K3w5S510|0c0A5Q565-0@4w040e3V5#4X3i0|0s5}4-5%4D042;623M0Y0|5Y0F0u0K5x3T5z6g416a042s6j5N4U6o5T4!4$4(0k4*4~4Q5$5.040g535=575?5o0F5b1U2(685j5l6N5E043u5c6d6f5+5@016i6X6I5F6u5I6y5C5o4T0c6r5 666/0@4T0A4:5+586A5a6m5r4{0k6=6Z5O6F6G6Y6J6m6L6W2}6{5~0@5(0h5*7c6Y0o2b042c0P0r01755R6$790u6M6`6Y7g7i3d7d631-7l0|01037r7y5o5(0E6Q4H4^4`4|6*5L6,5/7278616#6|73045;5+066G767u5V5X5Z7b6z7e015(0J7Y0|0p0D0D2i0!726!4 7$781;7x847@523Q7+7t7$5_2L0d4|0F7P5T7/5Y127=3o0~0X4q4m478v0X4a1u0d4c8A2X2T1{1}2V0p1(8x4a1A4s7E0@2L0y0Z0e0p0#0K0Z0I0m0|1m1o1q1s0r546X1H3e1B0j0G0r1s0d0r0p0t0=0s0r2C8{8K0r2I0M0k0N0K0k0r1)910s5W8o2u8=1e1b0+0s0o288@0t2(989j4$9f241i940I2i2E1d8*1D3e2,3r1/1W1Y1!8O3r2r2i2k0|2x0W930`8@0B0O221d464l8O2~4o8u9J3T5_4y72654=7#7@4I4K4M5J898P7%5A9^4@046t5H6w9@7?9_4/8l6:4_1)7T825O8+2}8d6H850|0)0+1)a67f6P7Lah6~6d5s5u0p5w9/a40|9{a39}9 6v6xab6C6F6Y8g0(8jam7%6.ax9}6T5d8q7V7$83aB3T78aD6)aGaP9|aZ60aG6^aN78aj0GalaQ6h74ap7@7gaN7G7n8*7qaNa{a_9_a}7I7K7j7M0|7Ob39}a8707U9(3`6-7{6;a?bi0|7)b88f0|5{71bca*blbqa`6567bv6k6b286eaGaA6+856l6nbm6pbIaV9:6%a0aFbN4S5O0gbp3d8s9%8w2S8M490(0*0,04.