Aller au contenu

Longueur maximale d'intervalle équilibré⚓︎

On considère une liste bits constituée uniquement de 0 et 1. Écrire une fonction telle que l_max_equilibree(bits) renvoie la longueur maximale d'une tranche qui contient autant de 0 que de 1.

Exemples

🐍 Console Python
>>> bits = [0, 0, 1, 0, 0, 0, 1, 1, 0, 0]
>>> l_max_equilibree(bits)
6
En effet, la tranche [1, 0, 0, 0, 1, 1] est équilibrée et de longueur maximale.

🐍 Console Python
>>> bits = [1, 1, 1, 1]
>>> l_max_equilibree(bits)
0
En effet, la tranche [] est équilibrée et de longueur maximale.

🐍 Console Python
>>> bits = [1, 0, 1, 0, 1]
>>> l_max_equilibree(bits)
4
En effet, la tranche [1, 0, 1, 0] est équilibrée et de longueur maximale. Il y a également [0, 1, 0, 1] équilibrée et aussi de longueur maximale.

On écrira ici un algorithme qui fait une double boucle. Vous retrouverez ensuite cet exercice à faire avec une simple boucle.

###(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
.128013:pbv(40i2+edxm3;s7= 1o5w_lSnatf-)9h]6,qcrg.*[yPku8/050m0l0E0D0i0A0r0u0O0A0D0r0r0t010E0i0c010406050r0X0o0o0D0P0U040B0w0A0X0@0w0C050Z0~1012140|0c041d1k051n0Z1n1p1k0|0m0i0e0,0.0:0=0J0i0Q0J0A1D0J0E0`050%0d0A0l1y0/0;011C1E1G1E0E1M1O1K0E0d0w0m141L0P1l0E0J0,170r0c0D0C0=0j011Q1A010F0)0l0C0D0o0l1K1=1@1|1S1 1O22240`0a0u0V0P0w0c0w0r0i1a0C0u0#1:0P0P0l0O2p1d270C1l0Z1.2C0E1,1+1-0m290=1G0C212m1K1v1x0-1R2M0i2O0C1(1w1K0c2v1l2A2C2*0}1?2q2U1}2Z0P110A0`0u0v2z2.0{2-282:1S2=2@2_0j2|1@2~2A2L01330D2^040u0p372B0|3a310=3d3f0u0g3j392.3b3p2_0x3t3l3v3n3c0w2?3e2_0L3A2 2/1z323F343g0s3K3m3N3o3P3H3g0Y3T3C3V3E3G3q0I3#303%3x040v0h3,3M2V3(3Q0v2{1e2}1m2(1d2S2F0m2J3b0O1(251l421o402,3}3805470#2)3$3^0W0`0#0F3t3L3b0y2_4r3U3^0C0F0`0A0z110n0z0l0N0X0)0i0d2v0l4w4l1}0_040f4P3-4y0`0d2o0r4V3@4R0`0H0b3A0u4-0u4s3D0C0`0O0 0X0A3t4/4x1}0w0`0t4{4:3%4S0T4$3b0o0i0`3=4f2B533^4S0K4,4.5f1}4n040F3F524}320`0n5r4Q1S0w4u042X5w4W2;4Y4!573D4S4+5d0{4.5O4|5x3o4?4^4`5M5l5y0`0R5I3.0`0D0c0c210m5#5g0`4U5W5s5S044@0o4_5-4(04565;5R014 040G5{1S590`3|2,5=015h5D4%5Y040k6e3w5u650=4S0H5j4-5X5?4C4E6j3D62515M5Q5E665a045c2*065O6s015n5p0P6w5$5B0z1 1c6A6K5z0`5C6V6b0C0d0`0P1@0Q4O5 6C6n5/6m01673:6;4S0M6P3^6?693~6b626i6-6f3o6%042c6^6:736k044Z0E4#7b5J4)4*6q5P6K6M5q6!604=6R0#0d196{4~5A6Z2*6B743c766)0C6+794T6;7s0i6S7A6 606o5L6H5P7V7C3b5n0i4q7q6.6=6E367h3%620S7J5:6a7r5T5_5V7;7%557L6Y7O6U7_7D6d7$7D6264837c5^5`7+5.5}7|7t0l7v0E7J0K6p876x506z7B6K7M7~7x6g868q6#7}7u7w8b5|7T2}6I7W8H7n6Y7#8x7=6R6T8u0=858Q3c8z8g8B8M7%62020Q0E0q8T7s6u0D5v8C1S5K7l8H8I8y774D8,8T6y8)7}8P8m7,0`8w2}7X4;8V8h7l8J042v0E0X0P7 948r4B8_8-6H1d4i0l2C2%9p411w432F2H2D1%1)2F0D1N9s0Z420|9F0$0(0*04.
Indice 1

On pourra construire une liste des cumuls du nombre de 1 de l'indice 0 jusqu'à l'indice i exclu.

Par exemple, avec bits = [1, 1, 0, 0, 1],

on aurait cumul = [0, 1, 2, 2, 2, 3] qui possède un élément de plus que bits.

Indice 2

On pourra faire une boucle pour tous les indices de fin d'une tranche et pour chaque indice de fin, une boucle pour chaque indice de début possible.

Indice 3

Pour un indice de début et de fin, on a une largeur de tranche et on peut avec une soustraction de deux valeurs de cumul connaitre le nombre de 1. On peut donc facilement savoir si la tranche est équilibrée.

Indice 4

On pourra compléter le code

🐍 Script Python
def l_max_equilibree(bits):
    cumul = [0]
    for x in bits:
        cumul.append(...)
    l_max = ...
    for i_fin in range(...):
        for i_debut in range(...):
            if ...:
                if ... > l_max:
                    l_max = ...
    return ...