Aller au contenu

Entraînement pour le devoir surveillé 4⚓︎

Exercice 1

On souhaite faire une fonction qui renvoie la deuxième plus grande valeur, appelée deuxième maximum, d'un tableau d'entiers.

Si le maximum a plusieurs occurrences dans le tableau, alors le deuxième maximum est égal au maximum.

S'il y a moins de deux valeurs dans le tableau, il n'y a pas de deuxième maximum.

Exemples de tableaux
valeurs1 = [5, 7, 3, 14, 25, 11, 19, 1]
valeurs2 = [16, 4, 6, 16, 3]
valeurs3 = [9]
  • Dans le tableau valeurs1, le maximum est 25 et le deuxième maximum est 19.
  • Dans le tableau valeurs2, le maximum est 16 et le deuxième maximum est également 16.
  • Dans le tableau valeurs3, il n'y a pas de deuxième maximum.

Écrire le code de la fonction deuxieme_max qui prend en paramètre un tableau d'entiers et qui renvoie la deuxième plus grande valeur du tableau.

Exemples d'utilisation
>>> deuxieme_max([5, 7, 3, 14, 25, 11, 19, 1])
19
>>> deuxieme_max([16, 4, 6, 16, 3])
16
>>> deuxieme_max([9])  # None ne s'affiche pas dans le terminal
>>> 
Indications
Indication 1

Il faut une variable pour le maximum et une autre pour le deuxième maximum.

Puisqu'il peut ne pas y avoir de deuxième maximum, ni de maximum, on commence par initialiser ces deux variables avec None.

Indication 2

Lors du parcours du tableau, il y a essentiellement 3 cas possibles :

  1. Soit on n'a pas encore vu de maximum, soit la nouvelle valeur est plus grande que le maximum actuel.

  2. Soit on n'a pas encore vu de deuxième maximum, soit la nouvelle valeur est plus grande que le deuxième maximum.

  3. Soit la nouvelle valeur est inférieure au deuxième maximum.

Indication 3

Lorsqu'on voit un nouveau maximum, l'ancien maximum devient le nouveau deuxième maximum.

Contraintes

Il est interdit d'utiliser max, sort ou sorted.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
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

.128013;)3=9xlwnN8gvS"5/:rf7uemkdas p h10itP(_y246cbo030u0r0E0v0D0b0w0x0M0b0v0w0w080j0E0D0y0j020z030w0q0s0s0v0n0I020i0O0b0q0(0O0d030l0/0;0?0^0-0y020318111b0l180-0u0D0h0X0Z0#0%0A0D0g0A0b1p0A0E0+030S0N0b0r1k0!0$0j1o1q1s1q0E1y1A1w0E0n190E0A0X0{0w0y0v0d0%0J0j1C1m0j0o0U0r0d0v0s0r1w1V1X1$1E1(1A1+1-0+040x0F0n0O0y0O0w0D0~0d0x0Q1T0n0n0r0M25111:0d190l1R2i1O1Q1P1x0u1=0%1s0d1*221w1h1j0Y1D2s0D2u0d0O2y1w0y2b192g2i2M0.1W262A1%2F0n0=0b0+0x0B2f2Q0,2P1;2S1E2U2W2Y0J2#1X2%2g2r0j2+0v2X020x072/2h0-2=2)0%2^2`0x0K2~2;2Q2?342Y0k38303a322@0O2V2_2Y0L3f2'2R1l2*3k2,2{0p3p313s333u3m2{0f3y3h3A3j3l35093G2(3I3c020B0C381c2K112y2l0u1Q2q3i0M2G1.193Y1a3W2O122$033'0Q2L3H2B0j0t0+0Q0o380x3q3b0o3|0r0q0a0D0r1-0H0=0a3U3z3_0*020G4e3^2T0+0h2_450n0w4k3O4g0+060m3f0x4A404f4m024c2!3/2:4C4l1E0O0+083 413i0t0M0+0e0 0r4z4B4R3P0+4c2.4I2h4K4u1%4N024P4)2{4#3_4T4V4X4Z4A4?1%3{020o3k4Q4D2*4n534L0%0O0c0+2D574,55024o1A0q4r4t3r4v024y4;0z4B5t4+5n4~5c3~4;5v3b4%0v0a4H2M5B3i4.084:5H4}1E4^024W2u5e5w4M5b02525A5O33565!54590+000g0E055U5C4F5E5G3:5(0j4h5q2M5s5u5~5#2@5D0a4(5N5^5K5/3i0d625?2:5}5~5t606a5;5F683I675'58615h4{5u604 0r1s5z656p6i4'6l3_5K5M2$5I3I5Q5S4Y6o5f595X5Z6z6O6q0h6D4-5*5,5.6N5V5$6j645@6p5`6s6f6I3_6B5E6(4J606n6S6$6U6s6u0+2b0E5k106#5:6C5r113=0r2i2J793X1i3Z2l2o2j0v1z7c0l3Y0-7m0R0T0V02.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
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

.128013;)3=9xlwnN8gvS"5/:rf7uemkdas p h10itP(_y246cbo030u0r0E0v0D0b0w0x0M0b0v0w0w080j0E0D0y0j020z030w0q0s0s0v0n0I020i0O0b0q0(0O0d030l0/0;0?0^0-0y020318111b0l180-0u0D0h0X0Z0#0%0A0D0g0A0b1p0A0E0+030S0N0b0r1k0!0$0j1o1q1s1q0E1y1A1w0E0n190E0A0X0{0w0y0v0d0%0J0j1C1m0j0o0U0r0d0v0s0r1w1V1X1$1E1(1A1+1-0+040x0F0n0O0y0O0w0D0~0d0x0Q1T0n0n0r0M25111:0d190l1R2i1O1Q1P1x0u1=0%1s0d1*221w1h1j0Y1D2s0D2u0d0O2y1w0y2b192g2i2M0.1W262A1%2F0n0=0b0+0x0B2f2Q0,2P1;2S1E2U2W2Y0J2#1X2%2g2r0j2+0v2X020x072/2h0-2=2)0%2^2`0x0K2~2;2Q2?342Y0k38303a322@0O2V2_2Y0L3f2'2R1l2*3k2,2{0p3p313s333u3m2{0f3y3h3A3j3l35093G2(3I3c020B0C381c2K112y2l0u1Q2q3i0M2G1.193Y1a3W2O122$033'0Q2L3H2B0j0t0+0Q0o380x3q3b0o3|0r0q0a0D0r1-0H0=0a3U3z3_0*020G4e3^2T0+0h2_450n0w4k3O4g0+060m3f0x4A404f4m024c2!3/2:4C4l1E0O0+083 413i0t0M0+0e0 0r4z4B4R3P0+4c2.4I2h4K4u1%4N024P4)2{4#3_4T4V4X4Z4A4?1%3{020o3k4Q4D2*4n534L0%0O0c0+2D574,55024o1A0q4r4t3r4v024y4;0z4B5t4+5n4~5c3~4;5v3b4%0v0a4H2M5B3i4.084:5H4}1E4^024W2u5e5w4M5b02525A5O33565!54590+000g0E055U5C4F5E5G3:5(0j4h5q2M5s5u5~5#2@5D0a4(5N5^5K5/3i0d625?2:5}5~5t606a5;5F683I675'58615h4{5u604 0r1s5z656p6i4'6l3_5K5M2$5I3I5Q5S4Y6o5f595X5Z6z6O6q0h6D4-5*5,5.6N5V5$6j645@6p5`6s6f6I3_6B5E6(4J606n6S6$6U6s6u0+2b0E5k106#5:6C5r113=0r2i2J793X1i3Z2l2o2j0v1z7c0l3Y0-7m0R0T0V02.
Exercice 2

On souhaite écrire une fonction qui compte le nombre de A qu'il y a dans des mots de la forme "AAAAA....AAABBB....BBBBBBB", c'est-à-dire composés par une suite de A (éventuellement aucun) puis une suite de B (éventuellement aucun).

Certains des mots qui seront étudiés seront très très long (plusieurs milliards de milliards de lettres). Il faut donc trouver un moyen astucieux de compter les A.

Nous allons utiliser la dichotomie. L'idée c'est que nous allons chercher la position du dernier A par dichotomie.

Pour l'instant nous supposons qu'il y a au moins un A. Nous allons utiliser 2 variables, g et d, tels que si on note i l'indice du dernier A, alors g <= i < d. L'indice g correspond donc à un A et d n'est pas l'indice d'un A (il peut être en dehors du mot).

Il y a 2 cas :

# On a mot[m] == "A"
mot = "...AAAAAAAAAAABBBBBB..."
                     
            g    m     d

# On peut donc faire avancer g
mot = "...AAAAAAAAAAABBBBBB..."
                      
                 g     d
# On a mot[m] == "B"
mot = "...AAAAAABBBBBBBBBBB..."
                     
            g    m     d

# On peut donc faire reculer d
mot = "...AAAAAABBBBBBBBBBB..."
                     
            g    d     

On s'arrête lorsque g et d se suivent :

mot = "...AAAAAABBBBBBBBBBB..."
               ↑↑     
               gd     

S'il n'y a pas de A, alors on peut répondre 0 en regardant juste le premier symbole du mot.


Écrire le code de la fonction compte_les_a qui prend en paramètre un mot non-vide composé par une suite de A puis une suite de B et qui renvoie le nombre de A dans ce mot.

Exemples d'utilisation
>>> compte_les_a("BBBBBB")
0
>>> compte_les_a("AAABBBBBB")
3
>>> compte_les_a("A"*147 + "B"*981)
147
Indications
Indication 1

Si le premier symbole est un B, alors il n'y a pas de A.

Indication 2

Au début, pour s'assurer que d n'est pas sur un A, il faut qu'il soit égal à la longueur du mot, pour correspondre au premier indice qui sort du mot.

Indication 3

Lorsqu'on voit un A en m, il faut faire avancer g mais pas au dela de m, parce qu'on ne sait pas ce qu'il y a en m+1.

De même lorsqu'on fait reculer d, il ne faut pas aller avant m car on ne sait pas ce qu'il y a en m-1.

Indication 4

À la fin, la différence entre g et d doit être exactement de 1.

Indication 5

Une fois le dernier A trouvé, il faut en déduire le nombre de A.

S'il y a un seul A, alors g=0 et d=1.

S'il y a 2 A, alors g=1 et d=2.

...

Contrainte

Les mots pouvant être très très long, dans les tests secrets, le nombre de lectures du mot est limité à 500, même s'il y a des milliards de milliards de lettres.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
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

.128013;)3B=9+lwqn8gvS"A5/:rf7uemkdas p h10itP(_y2[46cb]-o030w0t0G0x0F0c0y0z0P0c0x0y0y090k0G0F0A0k020B030y0s0u0u0x0p0K020j0T0c0s0-0T0f030n0@0_0{0}0=0A02031d161g0n1d0=0w0F0i0$0'0)0+0C0F0h0C0c1u0C0G0:030X0Q0c0t1p0(0*0k1t1v1x1v0G1D1F1B0G0p1e0G0C0$100y0A0x0f0+0L0k1H1r0k0q0Z0t0f0x0u0t1B1!1$1*1J1-1F1:1=0:040z0H0p0T0A0T0y0F130f0z0V1Y0p0p0t0P2a161^0f1e0n1W2n1T1V1U1C0w1`0+1x0f1/271B1m1o0%1I2x0F2z0f0T2D1B0A2g1e2l2n2R0?1#2b2F1+2K0p0`0c0:0z0D2k2V0;2U1_2X1J2Z2#2%0L2)1$2+2l2w0k2:0x2$020z072@2m0=2`2.0+2}2 0z0N332_2V2{392%0m3d353f372|0T2!2~2%0O3k2,2W1q2/3p2;300r3u363x383z3r300g3D3m3F3o3q3a0a3L2-3N3h020D0E3S3w2G3O3A0D2(172*3l3T3#3V0D2?3)2^1h2P162D2q0w1V2v3n0P2L1?1e3_1f3@2T3;2m033 0V2Q3M3#0v0:0V0q3d0z3v3g0q0:3 0u0A0G0t0J1F0y0J0x3d4l3n0/020I4z3E3-0:0u0T0G4F4d1+4C060o3k0z4T4k4G1+4f020F4i47304A3U4I4K4M3,4O0:0M4+3!1+0u0F0:3Y4$4'3#4C0R4j4{1+0T0:09094 4W1J0y1(02000e0s4K05085c5e0G054:2{4C4R4$0B4U5s4V4N1J4Y2g0G0s0p154$5u4,1J4?4^4S4U502/0:0h565v0+5202555D5L0+5H024_2R5r5K57384g5P5F5R535*4;2/0Q0:1}5m4B0:4E4`5'2|4)4L5{5Q0k4P5J4T5W0k4Y0d1t1F5.3g5)5V5|5S0S6c3n0f5N6j3N5S000h5k6n3#5Y3(2T5|5o645t666l020u6t515-6f614C5`6x616D0w5@6o0:0b6R4H025O605+620:066G1J5S0n0n6'5X4@023:5#5t5%614Y4!6,5}6E4*6Z5/0+4C4/6~6d6E6V4-024~6J6!5S546`590:5i5f0l7h6s735^025p6;6=6B5|6D6Y2R5E6 0k7c6`6D6F5q7r7x2{4Y0t0!0t761J6z7E7F6?6!6P6`7A7a7y7C6A665x0W5A5C7w6C6e5#164a0t2n2O7.3^1n3`2q2t2o0x1E7;0n3_0=7~0W0Y0!02.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
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

.128013;)3B=9+lwqn8gvS"A5/:rf7uemkdas p h10itP(_y2[46cb]-o030w0t0G0x0F0c0y0z0P0c0x0y0y090k0G0F0A0k020B030y0s0u0u0x0p0K020j0T0c0s0-0T0f030n0@0_0{0}0=0A02031d161g0n1d0=0w0F0i0$0'0)0+0C0F0h0C0c1u0C0G0:030X0Q0c0t1p0(0*0k1t1v1x1v0G1D1F1B0G0p1e0G0C0$100y0A0x0f0+0L0k1H1r0k0q0Z0t0f0x0u0t1B1!1$1*1J1-1F1:1=0:040z0H0p0T0A0T0y0F130f0z0V1Y0p0p0t0P2a161^0f1e0n1W2n1T1V1U1C0w1`0+1x0f1/271B1m1o0%1I2x0F2z0f0T2D1B0A2g1e2l2n2R0?1#2b2F1+2K0p0`0c0:0z0D2k2V0;2U1_2X1J2Z2#2%0L2)1$2+2l2w0k2:0x2$020z072@2m0=2`2.0+2}2 0z0N332_2V2{392%0m3d353f372|0T2!2~2%0O3k2,2W1q2/3p2;300r3u363x383z3r300g3D3m3F3o3q3a0a3L2-3N3h020D0E3S3w2G3O3A0D2(172*3l3T3#3V0D2?3)2^1h2P162D2q0w1V2v3n0P2L1?1e3_1f3@2T3;2m033 0V2Q3M3#0v0:0V0q3d0z3v3g0q0:3 0u0A0G0t0J1F0y0J0x3d4l3n0/020I4z3E3-0:0u0T0G4F4d1+4C060o3k0z4T4k4G1+4f020F4i47304A3U4I4K4M3,4O0:0M4+3!1+0u0F0:3Y4$4'3#4C0R4j4{1+0T0:09094 4W1J0y1(02000e0s4K05085c5e0G054:2{4C4R4$0B4U5s4V4N1J4Y2g0G0s0p154$5u4,1J4?4^4S4U502/0:0h565v0+5202555D5L0+5H024_2R5r5K57384g5P5F5R535*4;2/0Q0:1}5m4B0:4E4`5'2|4)4L5{5Q0k4P5J4T5W0k4Y0d1t1F5.3g5)5V5|5S0S6c3n0f5N6j3N5S000h5k6n3#5Y3(2T5|5o645t666l020u6t515-6f614C5`6x616D0w5@6o0:0b6R4H025O605+620:066G1J5S0n0n6'5X4@023:5#5t5%614Y4!6,5}6E4*6Z5/0+4C4/6~6d6E6V4-024~6J6!5S546`590:5i5f0l7h6s735^025p6;6=6B5|6D6Y2R5E6 0k7c6`6D6F5q7r7x2{4Y0t0!0t761J6z7E7F6?6!6P6`7A7a7y7C6A665x0W5A5C7w6C6e5#164a0t2n2O7.3^1n3`2q2t2o0x1E7;0n3_0=7~0W0Y0!02.
D'autres exercices pour s'entraîner

Vous pouvez aussi aller regarder ces exercices :