Intrus dans une liste

On considère des tableaux de nombres dont tous les éléments sont présents exactement trois fois à la suite, sauf un élément qui est présent une unique fois et que l'on appelle « l'intrus ». Voici quelques exemples :

Exemple

tab_a = [3, 3, 3, 9, 9, 9, 1, 1, 1, 7, 2, 2, 2, 4, 4, 4, 8, 8, 8, 5, 5, 5]
#l'intrus est 7

tab_b = [8, 5, 5, 5, 9, 9, 9, 18, 18, 18, 3, 3, 3]
#l'intrus est 8

tab_c = [5, 5, 5, 1, 1, 1, 0, 0, 0, 6, 6, 6, 3, 8, 8, 8]
#l'intrus est 3

On remarque qu'avec de tels tableaux :

  • pour les indices multiples de 3 situés strictement avant l'intrus, l'élément correspondant et son voisin de droite sont égaux,
  • pour les indices multiples de 3 situés après l'intrus, l'élément correspondant et son voisin de droite - s'il existe - sont différents.

Ce que l'on peut observer ci-dessous en observant les valeurs des paires de voisins marquées par des caractères ^ :

[3, 3, 3, 9, 9, 9, 1, 1, 1, 7, 2, 2, 2, 4, 4, 4, 8, 8, 8, 5, 5, 5]
 ^  ^     ^  ^     ^  ^     ^  ^     ^  ^     ^  ^     ^  ^     ^
 0        3        6        9        12       15       18       21

Dans des listes comme celles ci-dessus, un algorithme récursif pour trouver l'intrus consiste alors à choisir un indice i multiple de 3 situé approximativement au milieu des indices parmi lesquels se trouve l'intrus.

Puis, en fonction des valeurs de l'élément d'indice i et de son voisin de droite, à appliquer récursivement l'algorithme à la moitié droite ou à la moitié gauche des indices parmi lesquels se trouve l'intrus.

Par exemple, si on s’intéresse à l’indice 12, on voit les valeurs 2 et 4 qui sont différentes : l’intrus est donc à gauche de l’indice 12 (indice 12 compris)

En revanche, si on s’intéresse à l’indice 3, on voit les valeurs 9 et 9 qui sont identiques : l’intrus est donc à droite des indices 3-4-5, donc à partir de l’indice 6.

Compléter la fonction récursive trouver_intrus qui met en œuvre cet algorithme

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

.1280136ewn-f(9[1*= :7dcokliy5.sP3r/h,b]RtuSxam2g0)84_+vp050q0c0J0N0v0u0z0n0r0u0N0z0z0m010J0v0Y010406050z0K0O0O0N0C0w040L0s0u0K0?0s0e050D0}0 11130{0Y04051j1c1m0D1j0{0q0v0X0+0-0/0;0-0e0Q0K0N0Q0c0f0Y0w0J0E1a0n0E0v0Q0E0u1O0E0J0_050$0G0u0c1v0.0:011N1P1R1P0J1X1Z1V0J0C1k1J0+160z0Y0N0e0;0P011#1x010g0(0c0e0N0O0c1V1`1|211%241Z27290_0a0n0A0C0s0Y0s0z0v190e0n0!1^0C0C0c0r2u1c2c0e1k0D1J2H1;1?1=1W0q2e1y0v0e262r1V1s1u0,1$2R2T0e0s2X1V0Y2A1k2F2H2.0|1{2v2Z222%0C100u1V0N1M2A0g0;030V0V0r2(0c1R2$0s0f0P0f0k0_0n0k1c0N2/2=0`2;2d2@1%2_2{2}2 0c3101333537392U3c3c3g0P3j3l1|3n2F2Q013s0N2|1k2~0E303234360!3C2%3E0B3g0B3I2E3m0{3M3q0;3P3R053T3V3y3X3B2S3D3d0U3g0U3*1d3,3o2?1w3r0s2`3Q3u3U3w3W3A3Z3|3#3d0x3g0x422.3-2=3N3;4c3^3z3Y384i3b3d0b3g0b4o443.473:493t3S3v3x4w3{3a3E0p3g0p4F3K4q3p4I3O4K4b4M4d4O3`4h4R3d0T3g0T4W2G4Y462!4#4a3=3@4e3_4g4y4-0f0i3g0i4=3L4r3/4`4L3?4N4f4x3!4A3e0R0_0k0R574@4s4$4|5e4 5g4z3E0k3f045y5o455q4{4u4~4P4,3}3e1 5A3H0D3k3+4X5D5a4t4(4v4+515K0k3%5A3)5P3J4?5T4!5V5d4)5f4Q5!3 5A415)5R5+4H4_5.4}4*505h5x4l5A4n5`435S5}2^5r5G615v520k4C5A4E684p5,5~6d5W5H5Y633d0k4T5A4V6m3m1n2,1c2X2K0q1?2P5a4x2W1t1k2+0c2-6B692G054x6R2d0v0q0;342F5x3u6Z6#625w6v202i0c6+6g5!1V5`6b1%0t0_0!0g5{6X4^220d3g706o2^0g0_1;0s0K0X0c0C0V2S1;0K0z766`0;0^040h7m595-7a0N0G7s4Z4_7p0F700n773r0_0Q7y721%7B7D7F3:6}7J3N7p0S0o700{6T710n6*016$2=3E5M5d7#6t6-3F0n6:6=5=4j3F2H5Q7n0174040n7 7E7Y7O010z0q0_00887W7R7,0V6%3d5$7+6!7$6,523%7:286;8j6?7@8g6_7t4_853g800I260X0s0v1!0-0n0X3Q0c0K0C2w8F007i0C7k0n2s0J0K1!261;8F0c0*2S1s0r8#0n0Q0n0#2w8a823M8c8e0f5@8h7=5J7@3 8n298{5Z8}6^7`8v228x7~800q1|0*8G1R0z0J1!1X0n7c0n7V7Y7X2:8=8i7%1|3E658`8q7?5i4l8 8p7-529w8u7z97869980809j7e0C0v248!0*360e1s2u0*2x0u000c0M7f0r0v8)7C9o8b9s8d7(4B6)9:8r5i4C9C916u0f6j3*7{989M9M8,8.2P0z1a0J8N0*0O0K0u0?0Y1Z9Z1!0B0y8:9q4r8?9=0f6x9x9E5K4T9|9y8|5iau9H7K0;a3808800ao6B9r6+8@4/4M8c9_3E4/azaw7@aQ3I9M836|049R7N7{0e7Ha*961%0s0_0m0ma.9I7G040q7R5a7p9n6n8;aq9:8@54aR9^9z3E54aW8k5Kb6a!a47 a$0_2A8V0C1b7Y7Ea+7v7xb2a_7o0_0ja}7u047IbuaF017p0HaL3K5Dar9u6v5kb79}7.5m6/8obQ6hbO3I9paMb3aOas5y9@bV5!3fbcaT6v5zbgbi7{a%380z0cbz7A0_b044bD7!b4b%7*2~aSb96v1 b-c75L949La483a,042%0O0G2A0V0!0V1;0@1Z0J7lbp83a;04a@cv7{7p7rc05U7QcAa/0;cx0fa^bEchbCapbvbF0_0Sb{22cx0D0DcV1%0O0v0_5(b1cQ2vbL0e5x8gc5b8aBc/bT90aA925i5#cdbhb=cI3O0_8%9+b`cHcRcxcz2.bqd1cOcM3Ncx0Wdf5ac$c(c!cJ0_0ldncS7qdrchcjcl0ccndycqai0#cuc+dg0_cYdrdl045OdFa~cTbI6UaN8j8@0k8_c;b*7@dVc^9DbddZ8_5)c dccRa%a)d7cNbsdr7pbycEbAd48)d?0_bHd:dGcyda3md,d;041Xd}04d^dNd`9Wd5dj4!dheg4_dK3id_b|04d db83a dQ7Zc-64b)c`9~0k9B7;ezbR9G3kd+a#b?bk0#8Lboerbre72o7d7f7h0e7jdEb!cRcCdud=en227Me0cFa(eed|e+eh0_die:ekc%04c)eZbEe*ePddcGeceocU9.c0ew6va0dXeE6h9{eDaXc|a0d*c bj04b^d6f2e)b}eubKc2bM3eaufaff5xayfed%c|aDeHeId0d-eLbmeOe4cg7aeS9PeVeXe9cDfoa`e8e(7L0_9-e cRdefYbw04f#fMeQd{fne|7SdPf52:0D6W6C6Q6E6N1c0J6Hf 2N2I7w1Z2H6F7X0!0$0(0z04.