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

.1280132mhS)cleP=3tfnp_:avgby;s560or 1(k4iwu7dx/050N0i0m0s0J0h0y0E0g0h0s0y0y0k010m0J0p010406050y0L0c0c0s0D0w040e0C0h0L0*0C0o050P0;0?0^0`0/0p04051a131d0P1a0/0N0J0t0Y0!0$0(0d0J0u0d0h1r0d0m0-050T0v0h0i1m0#0%011q1s1u1s0m1A1C1y0m0D1b0m0d0Y0}0y0p0s0o0(0b011E1o010n0V0i0o0s0c0i1y1X1Z1(1G1+1C1.1:0-0a0E0j0D0C0p0C0y0J100o0E0R1V0D0D0i0g28131?0o1b0P1T2l1Q1S1R1z0N1^0(1u0o1-251y1j1l0Z1F2v0J2x0o0C2B1y0p2e1b2j2l2P0:1Y292D1)2I0D0@0h0-0F2i2T0.2S1@2V1G2X2Z0-0b2%1Z2)2j2u012.0s2!040l2=2k0/2^2,0(2{2}0I302@2T2_360-0z39323b342`0C2Y2|0-0A3g2*2U1n2-3l2/040M391e2N132B2o0N1S2t3j0g2J1;1b3D1c3B2R142(053J0R2O3i3t0(0H0-0R0n3z333Y010K0-0E3(3X2E2`0n0-0h110u0L0i0L0D0q0@0O3/2+3*0,040G423s3;0o0-0g0d0U2x0y482_450f0r3g0E4o3.3)4a0-400J394q3:1)0C0-0k4w3r2_0c0J0-0B4n4p4E3j3!040n3l4D4r2W0-0m0i0O4W4S4y1G0C3,042G4!434s044d4f0i4h3R2?4M440-4m4?314p4~4x4,1)4O0J3%4|0450492W0v3@1-4i3j4547564^4-4W4Y0i5e4_040f4+594$0-020u0m0x5s3c4t0s0O4v5i4T1G454{2P064 5N585B044u5A3j4A044C565P3j0o5b041{5o3;5g5)4U045l4Z5G4#0(4k3g5M4L5H3Z0-2e0m3}125Y5j5-5S560/0P3U0i2l2M6a3C1k3E2o2r2m0s1B6d0P3D670R0T0V0y04.

###(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

.1280132mhS)cleP=3tfnp_:avgby;s560or 1(k4iwu7dx/050N0i0m0s0J0h0y0E0g0h0s0y0y0k010m0J0p010406050y0L0c0c0s0D0w040e0C0h0L0*0C0o050P0;0?0^0`0/0p04051a131d0P1a0/0N0J0t0Y0!0$0(0d0J0u0d0h1r0d0m0-050T0v0h0i1m0#0%011q1s1u1s0m1A1C1y0m0D1b0m0d0Y0}0y0p0s0o0(0b011E1o010n0V0i0o0s0c0i1y1X1Z1(1G1+1C1.1:0-0a0E0j0D0C0p0C0y0J100o0E0R1V0D0D0i0g28131?0o1b0P1T2l1Q1S1R1z0N1^0(1u0o1-251y1j1l0Z1F2v0J2x0o0C2B1y0p2e1b2j2l2P0:1Y292D1)2I0D0@0h0-0F2i2T0.2S1@2V1G2X2Z0-0b2%1Z2)2j2u012.0s2!040l2=2k0/2^2,0(2{2}0I302@2T2_360-0z39323b342`0C2Y2|0-0A3g2*2U1n2-3l2/040M391e2N132B2o0N1S2t3j0g2J1;1b3D1c3B2R142(053J0R2O3i3t0(0H0-0R0n3z333Y010K0-0E3(3X2E2`0n0-0h110u0L0i0L0D0q0@0O3/2+3*0,040G423s3;0o0-0g0d0U2x0y482_450f0r3g0E4o3.3)4a0-400J394q3:1)0C0-0k4w3r2_0c0J0-0B4n4p4E3j3!040n3l4D4r2W0-0m0i0O4W4S4y1G0C3,042G4!434s044d4f0i4h3R2?4M440-4m4?314p4~4x4,1)4O0J3%4|0450492W0v3@1-4i3j4547564^4-4W4Y0i5e4_040f4+594$0-020u0m0x5s3c4t0s0O4v5i4T1G454{2P064 5N585B044u5A3j4A044C565P3j0o5b041{5o3;5g5)4U045l4Z5G4#0(4k3g5M4L5H3Z0-2e0m3}125Y5j5-5S560/0P3U0i2l2M6a3C1k3E2o2r2m0s1B6d0P3D670R0T0V0y04.
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

.1280132mhS)cle-P=tfnqp:avgby;sor 1(k+*iwud,/050K0i0m0s0H0h0y0B0g0h0s0y0y0l010m0H0q010406050y0J0c0c0s0A0w040e0z0h0J0%0z0o050M0.0:0=0@0,0q040517101a0M170,0K0H0t0V0X0Z0#0d0H0u0d0h1o0d0m0*050Q0v0h0i1j0Y0!011n1p1r1p0m1x1z1v0m0A180m0d0V0`0y0q0s0o0#0b011B1l010n0S0i0o0s0c0i1v1U1W1#1D1(1z1+1-0*0a0B0k0A0z0q0z0y0H0}0o0B0O1S0A0A0i0g25101:0o180M1Q2i1N1P1O1w0K1=0#1r0o1*221v1g1i0W1C2s0H2u0o0z2y1v0q2b182g2i2M0-1V262A1$2F0A0;0h0*0C2f2Q0+2P1;2S1D2U2W0*0b2!1W2i2J0i2i2y2l0K1P2q2)0#0g2G1.182^192K2%2h2/372 0O2L2Q2r010E0*0O0n383c2(1k1D0I0*0B3k363e0o0n0*0s0h0h0~0u0i3s2g3e0)040D3E3d2}010o0*0c0z0m3K3m2B013H0L3k3r3F3M3O043A0o0u0J0i0J0A3T2R3n0#3H0f0r3k060B3|3!3L3=3f0*2b0m3.0 112#3~3U2T3P3R3Z3t3M0z0*0F4e3#400y1Z04020p0J3R0x0B4q4s0m0x4k3 3V4h040G4A4a1D3H3J472:4f403%3)3+3-3/4L2h493;4C0*0j4G4X2T0v0*1^3:3G0*4K2O4l3V3%3Q3S4U3l4$4I0*0f0f3`103a2?1b350M332j2`102m590s1y52551h2$550P0R0T04.

###(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

.1280132mhS)cle-P=tfnqp:avgby;sor 1(k+*iwud,/050K0i0m0s0H0h0y0B0g0h0s0y0y0l010m0H0q010406050y0J0c0c0s0A0w040e0z0h0J0%0z0o050M0.0:0=0@0,0q040517101a0M170,0K0H0t0V0X0Z0#0d0H0u0d0h1o0d0m0*050Q0v0h0i1j0Y0!011n1p1r1p0m1x1z1v0m0A180m0d0V0`0y0q0s0o0#0b011B1l010n0S0i0o0s0c0i1v1U1W1#1D1(1z1+1-0*0a0B0k0A0z0q0z0y0H0}0o0B0O1S0A0A0i0g25101:0o180M1Q2i1N1P1O1w0K1=0#1r0o1*221v1g1i0W1C2s0H2u0o0z2y1v0q2b182g2i2M0-1V262A1$2F0A0;0h0*0C2f2Q0+2P1;2S1D2U2W0*0b2!1W2i2J0i2i2y2l0K1P2q2)0#0g2G1.182^192K2%2h2/372 0O2L2Q2r010E0*0O0n383c2(1k1D0I0*0B3k363e0o0n0*0s0h0h0~0u0i3s2g3e0)040D3E3d2}010o0*0c0z0m3K3m2B013H0L3k3r3F3M3O043A0o0u0J0i0J0A3T2R3n0#3H0f0r3k060B3|3!3L3=3f0*2b0m3.0 112#3~3U2T3P3R3Z3t3M0z0*0F4e3#400y1Z04020p0J3R0x0B4q4s0m0x4k3 3V4h040G4A4a1D3H3J472:4f403%3)3+3-3/4L2h493;4C0*0j4G4X2T0v0*1^3:3G0*4K2O4l3V3%3Q3S4U3l4$4I0*0f0f3`103a2?1b350M332j2`102m590s1y52551h2$550P0R0T04.
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

.1280132mhS)cleP=3tf.nqp_:aRvgby;s560or 1(]kx8+[*Ié4iwu7d9,/050Y0i0m0u0U0h0B0H0g0h0u0B0B0k010m0U0r010406050B0W0c0c0u0G0z040e0F0h0W0_0F0p0H020u0c0r0A0H0v0i130G0q0W0i0B050#101214160~0r04051B1u1E0#1B0~0Y0U0w0.0:0=0@0d0U0x0d0h1S0d0m0|050)0y0h0i1N0;0?011R1T1V1T0m1#1%1Z0m0G1C0m0d0.190B0r0u0p0@0b011)1P010n0+0i0p1h0i1Z1 21261+291%2c0c2e040a0H0j0G0F0r0F0B0U1c1e0%1}0G0G0i0g2z1u2g0p1C0#1{2L1^1`1_1!0Y2i0@1V0p2b2w1Z1K1M0/1*2V0U2X0p0F2#1Z0r2E1C2J2L2?0 201e2%272,0G130h0|0H0I2I2`0}2_2h2|1+2~30320b3521372J2U013c0u31040H0l3g2K0~3j3a0@3m3o0H0T3s3i2`3k3y320C3C3u3E3w3l0F2 3n320D3J382{1O3b3O3d3p0X3T3v3W3x3Y3Q3p0N3$3L3(3N3P3z0Z3.393:3G040I0E3C1F2;1u2#2O0Y1`2T3M0g2-2o0$1L1C2:0i2=363 490%4h3_2(010L0|0%0n3 3%4o0V324u3/4o0p0n0|0y142E1t1v4i4v270{040J4z4n2}0|0g0u0m0i0x3O0U1s4Q3V4o4N0!3C0H3U3F0|0w3n0i0W0G4I2^4L1+4N0f0t3J0H504,4`3x0|0h1d0x1r4?4+4-3M0F0|0k5b533l5557590G0s130M4$3k4N4P4J3h5c3`4T4V4X4Z4#5v2K5x4(0|0f4 515G4S041K0u0x0G1h2n5h4A275e045g5E3p5M4{0|0P0K5K505%0@4q040n3O5V4R3b0|0U5@4%5X4x042*5|3F0y0|5S0p0x0i5r3M5t6a3`64042l6d5H4O6i5N4U4W4Y0G4!4^4K5W5(040f4}5,515-5i0p551S2X625d5f6H5y043n5667695#5.016c6R6C5z6o5C6s5w5i4N0P6l5_606)0@4N0K4*5#526u546g5l4=0G6,6T5I6z6A6S6D6g6F6Q2?6=5^0@5Y0O5!766S0B2404021q0F0m1k0t1f7j7l6 5L6W730x6G6;6S7a7c36775}1+7f0|7i0W7k0A037H7J6K4o5Y0Q7O5N4:1%4?6!5F6$5)6|725{6V6?6}045+5#066A707t5P5R5T756t78015Y0o7#0|0u0r0r2b0Y6|6U4_7)721/7w877`4|3J7.7s7)5:2E0m4?0p7S6*7=5S127^3h0~0#4k4g408y0#431u0m458D2R2M0u1$8A431A4m7D0@2E0c0s0n0u0L0i0s0d0l0|1m1o1q1s0H4~6R1H371B0R0h0H1s0m0H0u0W0=0U0H2v8{8K0H2B0g0G0S0i0G0H1%910U5Q8r2n8=1e1b0+0U0B218@0W2X989j4W9f1}1i940d2b2x1d8*1F372#3k1-1U1W1Y8O3k2k2b2d0|2q0e930`8@0j0z1{1d3 4f8O2@4i8x9J3M5:4s6|5 4,7(7`4C4E4G5D8c8P7*5u9^4.046n5B6q9@7_9_4)8o6@7U6`7X9(3:4|8+2?8g6B880|0)0+1%a67{6J7x7t6O586`5o0u5q9/a40|9{a39}9 6p6r856~7-7:8i650(8man6%7~6M0has8t7Y7)86aC3M72aE6ZaH046(ay9}7%9|6b0|6/an72akaTaVab6j5Jaq7)7aan7F7h7p7m7o7I7qa}7`a b89_b17M7l7Lb3an7Qa=4/4;7Wa(a*a.6La-aZaca:an5:5=6{bba,bi5 61bAa!6f6668a(aB6#886f6ha+a/6kbQ6La$a1aa6S4|0f7,af1u9%8z2L8M420(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

.1280132mhS)cleP=3tf.nqp_:aRvgby;s560or 1(]kx8+[*Ié4iwu7d9,/050Y0i0m0u0U0h0B0H0g0h0u0B0B0k010m0U0r010406050B0W0c0c0u0G0z040e0F0h0W0_0F0p0H020u0c0r0A0H0v0i130G0q0W0i0B050#101214160~0r04051B1u1E0#1B0~0Y0U0w0.0:0=0@0d0U0x0d0h1S0d0m0|050)0y0h0i1N0;0?011R1T1V1T0m1#1%1Z0m0G1C0m0d0.190B0r0u0p0@0b011)1P010n0+0i0p1h0i1Z1 21261+291%2c0c2e040a0H0j0G0F0r0F0B0U1c1e0%1}0G0G0i0g2z1u2g0p1C0#1{2L1^1`1_1!0Y2i0@1V0p2b2w1Z1K1M0/1*2V0U2X0p0F2#1Z0r2E1C2J2L2?0 201e2%272,0G130h0|0H0I2I2`0}2_2h2|1+2~30320b3521372J2U013c0u31040H0l3g2K0~3j3a0@3m3o0H0T3s3i2`3k3y320C3C3u3E3w3l0F2 3n320D3J382{1O3b3O3d3p0X3T3v3W3x3Y3Q3p0N3$3L3(3N3P3z0Z3.393:3G040I0E3C1F2;1u2#2O0Y1`2T3M0g2-2o0$1L1C2:0i2=363 490%4h3_2(010L0|0%0n3 3%4o0V324u3/4o0p0n0|0y142E1t1v4i4v270{040J4z4n2}0|0g0u0m0i0x3O0U1s4Q3V4o4N0!3C0H3U3F0|0w3n0i0W0G4I2^4L1+4N0f0t3J0H504,4`3x0|0h1d0x1r4?4+4-3M0F0|0k5b533l5557590G0s130M4$3k4N4P4J3h5c3`4T4V4X4Z4#5v2K5x4(0|0f4 515G4S041K0u0x0G1h2n5h4A275e045g5E3p5M4{0|0P0K5K505%0@4q040n3O5V4R3b0|0U5@4%5X4x042*5|3F0y0|5S0p0x0i5r3M5t6a3`64042l6d5H4O6i5N4U4W4Y0G4!4^4K5W5(040f4}5,515-5i0p551S2X625d5f6H5y043n5667695#5.016c6R6C5z6o5C6s5w5i4N0P6l5_606)0@4N0K4*5#526u546g5l4=0G6,6T5I6z6A6S6D6g6F6Q2?6=5^0@5Y0O5!766S0B2404021q0F0m1k0t1f7j7l6 5L6W730x6G6;6S7a7c36775}1+7f0|7i0W7k0A037H7J6K4o5Y0Q7O5N4:1%4?6!5F6$5)6|725{6V6?6}045+5#066A707t5P5R5T756t78015Y0o7#0|0u0r0r2b0Y6|6U4_7)721/7w877`4|3J7.7s7)5:2E0m4?0p7S6*7=5S127^3h0~0#4k4g408y0#431u0m458D2R2M0u1$8A431A4m7D0@2E0c0s0n0u0L0i0s0d0l0|1m1o1q1s0H4~6R1H371B0R0h0H1s0m0H0u0W0=0U0H2v8{8K0H2B0g0G0S0i0G0H1%910U5Q8r2n8=1e1b0+0U0B218@0W2X989j4W9f1}1i940d2b2x1d8*1F372#3k1-1U1W1Y8O3k2k2b2d0|2q0e930`8@0j0z1{1d3 4f8O2@4i8x9J3M5:4s6|5 4,7(7`4C4E4G5D8c8P7*5u9^4.046n5B6q9@7_9_4)8o6@7U6`7X9(3:4|8+2?8g6B880|0)0+1%a67{6J7x7t6O586`5o0u5q9/a40|9{a39}9 6p6r856~7-7:8i650(8man6%7~6M0has8t7Y7)86aC3M72aE6ZaH046(ay9}7%9|6b0|6/an72akaTaVab6j5Jaq7)7aan7F7h7p7m7o7I7qa}7`a b89_b17M7l7Lb3an7Qa=4/4;7Wa(a*a.6La-aZaca:an5:5=6{bba,bi5 61bAa!6f6668a(aB6#886f6ha+a/6kbQ6La$a1aa6S4|0f7,af1u9%8z2L8M420(0*0,04.