Indice d'une panne

Une sonde interroge à intervalles réguliers l'état de fonctionnement d'un système électronique. Celui-ci peut être en marche ou en panne.

La sonde est programmée pour enregistrer les résultats de ses requêtes dans un log. Il s'agit d'un tableau de booléens (une list Python) dans lequel les valeurs True précèdent les False. La valeur True indique que le système est en marche, False qu'il est en panne.

Une panne nécessite une intervention humaine et ne peut donc pas disparaître seule : elle persiste jusqu'à la fin de l'enregistrement.

🐍 Script Python
#         0     1      2      3      4
log = [True, True, False, False, False]

Lors d'une vérification on constate que le système est en panne : le log contient au moins une valeur False en dernière position. On se demande à quel moment a débuté cette panne.

Dans l'exemple précédent, le premier False est à l'indice 2 : la panne a débuté à l'instant 2.

Écrire la fonction indice_panne qui prend en paramètre le tableau de booléens log et renvoie l'instant du démarrage de la panne.

On garantit que le log n'est pas vide et que, au moment de la vérification, le système est en panne (la dernière valeur du tableau est False).

Attention

La panne du système a aussi corrompu le fichier de log. Vous ne pouvez pas lire plus de 500 valeurs dans celui-ci. Passé ce nombre de lectures, tout nouvel accès lèvera une erreur.

Il est donc important de bien concevoir votre algorithme car les logs utilisés dans les tests secrets peuvent être très longs : un milliard de valeurs !

Exemples
>>> indice_panne([True, False])
1
>>> indice_panne([False, False, False])
0
>>> indice_panne([True] * 10 + [False] * 100)
10
>>> indice_panne([True, True, False, False, False])
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 : 10/10
.128013s3_8èufvIy n7aS1me(P24:twi][h)6Oo;bcdg/0làqAp.rL-,=+Nzk95Rxé050L0s0y0o0A0P0b0l0K0P0o0b0b0Z010y0A0T010406050b0g0r0r0o0V0k040p0H0P0g100H0m0l020o0r0T0I0l0*0s1a0V0R0g0s0b050N17191b1d150T041B1I051L0N1L1N1I150L0A0i0^0`0|0~0D0A0M0D0P1#0D0y13050:0J0P0s1W0{0}011!1$1(1$0y1.1:1,0y0J0H0L1d1-0V1J0y0D0^1g0b0T0o0m0~0v011=1Y010h0=0s0m1o0s1,2d2f2k1@2n1:2q0r2s040a0l0u0V0H0T0H0b0A1j1l0.2b0V0V0s0K2N1B2u0m1J0N292Z0y2726280L2w0~1(0m2p2K1,1T1V0_1?2-0A2/0m231U1,0T2S1J2X2Z34162e1l2^2l2}0V1a0P130l0q2W3814372v3a1@3c3e3g0v3j2f3l2X2,013q0o3f040l0c3u2Y153x3o0~3A3C0l0w3G3w383y3M3g0)3Q3I3S3K3z0H3d3B3g0F3X3m391X3p3$3r3D0n3+3J3.3L3:3(3D0e3@3Z3_3#3%3N0(3 3n413U040q0O463-2_423;0q3i1C3k3Y474f490q3t4k3v4m4e3b3{3C0q3F4s3H3,3T4x130q3P4B3R4n4w434G3W4J1K321B2?2$0L2*3y0K232C0-1U1J310s333k3Q054Z0.4+4L1@0%130.0h4-3^4f0z3g4{404o0h132{1T0K0s0d382/504=0~12040t5c4v3p130P0H0M5i3y5f0E0x3X0l5v0l4D3!4@040A4`4J5x4|2l0H4~042}0y3Q5F513b5l5n5p3!5f0C5T410r0A134c4Q5G1@5f0B5t4J065w5/5O5d015A2S0y0g0V0m5N5y5Y5!045$34065.5w5~4o4^0s0J1i5}5(0~0H130Z6d5P1@5Z5#5u666e3z132n5|5E675H6h6j5=0m0J5l2p5X4f5f5h5%6k3L5R5o6J5=5r6z5j6f130X6R3y6m4a3X655v6w4?130z1!1:6W3!0m696b5M6v6q6g04020P0y0I6i6?6K6r046t6F2l5f5,635:6p706/045Z1(0s0g6-416^6~345;6S016H745k040.6;7i4f6^0!7w5Q722{7r5e130E7A1@6^0N0N7I0~6Y4r78797n3y5A5C7N715m6N366q5V7E717e0A7g7X6^6V6 5=6Y4j7#705*7-5J2f0L7`135L7X7c7Z7(7%6O7o7c7*7,865q135+6o7S7a5=5@0/5`6u7m6%6L7d0=7+7h5-8g8o5?130s1(5D8n6@5J807:876M84135W8b6.13898t7@6P8d774l8g5/8w7c738G3y7k818O8r8a8C707.7X7=8f5:8w5A8z0b0s8J048U4t8W8h8H7t6a6c8#3!8%95488)7f8Q3k7T96137z984f8:5-1B4/4*4R9o0N4U1B0y4W9t2(2!22242$0o1/9q4U1H4;7o2S0r0d0h0o0%580D0c131t1v1x1z0l8}2Y1K3l1I0G1l1i8r8_0l0g2/0l2S0K0D0s0V9;1;560D0H0y0H5Z9V0l2M0,0V0o100i0s0U9!9G0j0P0l1z0y0l0o0g0|0A0l2Jak9D0l2P310H0K0,0.0Vaq1;1a0m0A0f2S9/0,0K5`2La7ae1l2{2%230g0A0b2fag0.0@2ea40r0f2%9W5,1R050g0P3l1(9#1J9n927v0Na:aq0,2L0M9.0P00550A57a10m0_ajaq0ga^6;ay0l0`0l0$1k9_1;9:9=9@9=aq2f0@1:5x1u04830Nbr0Yaa1Ba-15bz1Ma/4!7C6ua@0La_1#a|a~0m561;0s0+b4babc6tbT0obdbfbabi9?9^bm0mbo1;05brbtbra91O3l0NbB0Na*a.0SbV2P9.2e0@17bk1b0M9?bb1;4)5Zc50o0T0T8z5xa:a 57592f2/0t7Z7Ha?bE0Y0l1kaq1k9.aV0l0i3B7g0VaW1ba^9M1i0l0Q0^9WaX1oa!2S0bb:a(2?3y1_1%1)1+9H3y2y2p2r132E0p0K0V11ag0u0k291k4-4)9H354,a:8?698B4,6q5J5x8M48535BbNb0585a8`d36G136I8R91btdg8c04bw9i7B7u94dj9f047lc 700%0K130#bf8{dm8,6A6s7Ddc6xdt7(dxdzdBdI5)7G9Y148X6q7Vc~3v9e99a;dq9d8w5I541Adn4?dy04dA5bdP7F8|8;dU7b6:d$dYd(6yd,7O60628V7S8YdG8md%6@d dE876Cbs6Ed=7pde7(825Seh6Q5-6#dZ4fdW7~5K9|8(bsemdr4185eA68d#6=eD758Td^907U135^8lexdpeG4leqe68q9b7-ebe97^ejeh7ceReY049hec3Te78{coe-ds7L8/607Qe46$dV54dX2Yer7Bdidv8S048LeH7s8Pe*7/e=5 4G8{0Beu7|eu8FfdeEf33v8weCf491faeneJ8ue5e}04eO5{exfu7Re|dw8y8Afkewe07Yezfsdkf7fP8NeW8sfgdSeqd_8ieN8kfCfM7cchd9ckdbf8d?dffSd!fo9Z7$13dDe!dFeFdCfD8*9cfpf^04e;e{f16(048^f-f;ddd@fx79c|fAf$e8d}6qf)d7cida8{f:g2d`ey7!gceIdlf eXfM7ye^fffvgzf(e/gGg54t9mbE9p2Z9FbC9%0l5L9?bXa00LbncK1}1;a7cC0Acta}f*bab|1;bcbecwbh2Tbjb%afaebR1hba570P1:0X0K0A0U0l0WbXb#bk9_g!g;bZ4.4!cU1)1{1*2te#5gekd{eSgtf5f`glgu8!f.eig44-cp4:0l0b00cbaX2p0y1;3B3$0@ai0l0h1k2Ug*0m2/2B0mag3o0AgYg:bXhRb32Ncfhh3!cVhkcY8Yeea40mc4grhpf}gGhuf0eVhxgxdQhA4QhC4*9XbbbXcz1:5`h,2Ph.hjcXhmf|e)i5a@g{2{b49+hMcC0la0hgif41h/iicZfTi1fpi63Dg{bQb4a8bx9r0/0;0?04.
Astuce (1)

Il s'agit d'une recherche dans un tableau trié : les valeurs True sont au début, les False à la fin.

Astuce (2)

Si le log ne contient que des valeurs False, il faut renvoyer 0.

Dans le cas contraire, l'indice cherché est l'unique indice i qui vérifie log[i - 1] and not log[i].