En Travaux
difficile
Nombre solitaire
Soit \(n\) un entier positif ou nul. On considère un tableau contenant \(2n+1\) nombres entiers :
\(n\) paires de nombres, toutes distinctes ;
\(1\) nombre « solitaire » qui n'apparaît qu'une seule fois dans le tableau.
Les nombres de chaque paire sont toujours à la suite l'un de l'autre dans le tableau.
Ces tableaux seront représentés par des list Python.
En prenant \(n = 3\) , on a aura \(3\) paires d'entiers et \(1\) nombre solitaire :
Une liste contenant 3 paires et 1 nombre solitaire # indices 0 1 2 3 4 5 6
nombres = [ 2 , 2 , 5 , 6 , 6 , 4 , 4 ]
# ^
Le but de cet exercice est de déterminer efficacement la valeur du nombre solitaire.
Longs tableaux
Les tableaux utilisés dans les tests secrets sont longs : une recherche linéaire échouera.
De façon générale, dans les tests secrets, il est interdit de lire plus de la moitié des valeurs contenues dans le tableau.
Écrire la fonction solitaire qui prend en paramètre une liste décrivant un tableau tel que décrit ci-dessus et qui renvoie la valeur du nombre solitaire.
Exemple
>>> solitaire ([ 9 ])
9
>>> solitaire ([ 6 , 6 , 9 ])
9
>>> solitaire ([ 1 , 1 , 5 , 6 , 6 ])
5
>>> solitaire ([ 2 , 8 , 8 , 5 , 5 , 3 , 3 ])
2
Version itérative vide Version itérative à compléter Version récursive vide Version récursive à compléter
.128013s3o_8;bcdufvg/0ly n7apSr1-me(P2=4:+twk%i9][5h)6050j0C0K0v0O0q0b0s0i0q0v0b0b0G010K0O0w010406050b0k0B0B0v0y0r040x0d0q0k0:0d0t050o0`0|0~100^0w04191g051j0o1j1l1g0^0j0O0m0(0*0,0.0T0O0n0T0q1z0T0K0?050Z0h0q0C1u0+0-011y1A1C1A0K1I1K1G0K0h0d0j101H0y1h0K0T0(130b0w0v0t0.0F011M1w010l0#0C0t0v0B0C1G1.1:1^1O1{1K1~200?0a0s0E0y0d0w0d0b0O160t0s0X1,0y0y0C0i2l19230t1h0o1*2y0K1(1%1)0j250.1C0t1}2i1G1r1t0)1N2I0O2K0t1!1s1G0w2r1h2w2y2$0_1/2m2Q1_2V0y0}0q0?0s0z2v2*0@2)242,1O2.2:2=0F2^1:2`2w2H012 0v2;040s0c332x0^362}0.393b0s0H3f352*373l2=0S3p3h3r3j380d2/3a2=0V3w2{2+1v2~3B303c0u3G3i3J3k3L3D3c0f3P3y3R3A3C3m0P3X2|3Z3t040z0p3(3I2R3!3M0z2@1a2_3x3)3;3+0z323_343{3:2-3T3b0z3e413g3H3s460?0z3o4a3q3|453#4f3v4i434d4m3,3F4p4c3z3~3O4v3Q3}4e3,3W4A3Y4C4s0z3%4G4k3K4s0F3.4i1i2!192O2B0j2F370i1!211h4W1k4U2(4S4#0X2#4H1_0M0?0X0l3p4w3Z0L2=4`4B2-0l0?0b132k0!2r4 4;1O0=040D594N3k0?1V0C0v0k5f445b0?0U0I3w0s5u0s4{3}0?0O0e0X0h153p5w501O0d0?0G5F5x1_0B0O0?4R2$065v5G5a5h045A1{184i5W5g015J045L5%5N2~0h0?285n375c5e4S5H5Y5j5l5@3z5c0U3w5U5v5/0.4?040L1y1K5M5|385z5B0C5D0K6e5X5*0?020q0K0g5-2$5(5o5Y5!2T603Z5c5s4p5V5V6701690O4_5.6f0t6h5C5E6N6n5+0G6u2_6w3s6h5#6m5)5+0A6%6x015P4f6B3;6D5t6G6@6I692r0K0k0y5$6v6I6P045~5m5{6n5c0R6:2-6Q6j6S2(6f5c0Q646@5u716h5P1C0C75706f6V6+5^0?5`7f6n725A6R6l6T6(0?0J7v4x6#6A765)627J3Z5+0o0o7Q3;6.04405T656^6f6K6M7s7A7n0#0O7q7V1_5+0N7:1O7X7Z6Y6I6V6X346Z3z7X5S2_6I6=6F7k6H7%5z7)7{6O5i0v1J5k7r847g0?797N6,7B0e7o7.8j34850?7i7F6,7}7@5}8g1K5 8o7w048n7z5)8q8s7/8z375+7I8Q815Q3,7a5p040Q6E5T88887m5Z6i6k8C6o5,8.8N7-8P7*7G048T8^6,7_6?8(803Z690C0$0C8Y0.868%906G8*6z6 8d6U5K8;7,7p8u2x913;8S8.7X3^9a7$6n93959701993`9b9o4=8b9j738E8i9z789z8=9l9L8x8.8B8U3*8f8h8G8L6,9M8H7K8+8O9m3c7|7H9r8W9t8k778x8$9C9D668e8+6$9U9p9i9~7b9(8?9*7#8(6_0?940b969$6C0?9@429_9`7+8+7D9Sa08|6!a39Pa15I9-at0.9s3G0o4.0C2y2ZaC4V1s4X2B2D2z1Z1#2B9J2y4W0^0o0X0Z0#0b04.
.128013s3o_8;bcdufvg/0ly n7apSr1-me(P2=4:+twk%i9][5h)6050j0C0K0v0O0q0b0s0i0q0v0b0b0G010K0O0w010406050b0k0B0B0v0y0r040x0d0q0k0:0d0t050o0`0|0~100^0w04191g051j0o1j1l1g0^0j0O0m0(0*0,0.0T0O0n0T0q1z0T0K0?050Z0h0q0C1u0+0-011y1A1C1A0K1I1K1G0K0h0d0j101H0y1h0K0T0(130b0w0v0t0.0F011M1w010l0#0C0t0v0B0C1G1.1:1^1O1{1K1~200?0a0s0E0y0d0w0d0b0O160t0s0X1,0y0y0C0i2l19230t1h0o1*2y0K1(1%1)0j250.1C0t1}2i1G1r1t0)1N2I0O2K0t1!1s1G0w2r1h2w2y2$0_1/2m2Q1_2V0y0}0q0?0s0z2v2*0@2)242,1O2.2:2=0F2^1:2`2w2H012 0v2;040s0c332x0^362}0.393b0s0H3f352*373l2=0S3p3h3r3j380d2/3a2=0V3w2{2+1v2~3B303c0u3G3i3J3k3L3D3c0f3P3y3R3A3C3m0P3X2|3Z3t040z0p3(3I2R3!3M0z2@1a2_3x3)3;3+0z323_343{3:2-3T3b0z3e413g3H3s460?0z3o4a3q3|453#4f3v4i434d4m3,3F4p4c3z3~3O4v3Q3}4e3,3W4A3Y4C4s0z3%4G4k3K4s0F3.4i1i2!192O2B0j2F370i1!211h4W1k4U2(4S4#0X2#4H1_0M0?0X0l3p4w3Z0L2=4`4B2-0l0?0b132k0!2r4 4;1O0=040D594N3k0?1V0C0v0k5f445b0?0U0I3w0s5u0s4{3}0?0O0e0X0h153p5w501O0d0?0G5F5x1_0B0O0?4R2$065v5G5a5h045A1{184i5W5g015J045L5%5N2~0h0?285n375c5e4S5H5Y5j5l5@3z5c0U3w5U5v5/0.4?040L1y1K5M5|385z5B0C5D0K6e5X5*0?020q0K0g5-2$5(5o5Y5!2T603Z5c5s4p5V5V6701690O4_5.6f0t6h5C5E6N6n5+0G6u2_6w3s6h5#6m5)5+0A6%6x015P4f6B3;6D5t6G6@6I692r0K0k0y5$6v6I6P045~5m5{6n5c0R6:2-6Q6j6S2(6f5c0Q646@5u716h5P1C0C75706f6V6+5^0?5`7f6n725A6R6l6T6(0?0J7v4x6#6A765)627J3Z5+0o0o7Q3;6.04405T656^6f6K6M7s7A7n0#0O7q7V1_5+0N7:1O7X7Z6Y6I6V6X346Z3z7X5S2_6I6=6F7k6H7%5z7)7{6O5i0v1J5k7r847g0?797N6,7B0e7o7.8j34850?7i7F6,7}7@5}8g1K5 8o7w048n7z5)8q8s7/8z375+7I8Q815Q3,7a5p040Q6E5T88887m5Z6i6k8C6o5,8.8N7-8P7*7G048T8^6,7_6?8(803Z690C0$0C8Y0.868%906G8*6z6 8d6U5K8;7,7p8u2x913;8S8.7X3^9a7$6n93959701993`9b9o4=8b9j738E8i9z789z8=9l9L8x8.8B8U3*8f8h8G8L6,9M8H7K8+8O9m3c7|7H9r8W9t8k778x8$9C9D668e8+6$9U9p9i9~7b9(8?9*7#8(6_0?940b969$6C0?9@429_9`7+8+7D9Sa08|6!a39Pa15I9-at0.9s3G0o4.0C2y2ZaC4V1s4X2B2D2z1Z1#2B9J2y4W0^0o0X0Z0#0b04.
.128013s3o_8bcdufvg/0ly n7apSr1-me,(P2=4:+Ntwk%i9][5h)6050i0B0L0u0P0p0b0r0h0p0u0b0b0G010L0P0v010406050b0j0A0A0u0x0q040w0d0p0j0;0d0s050n0{0}0 110_0v041a1h051k0n1k1m1h0_0i0P0l0)0+0-0/0U0P0m0U0p1A0U0L0@050!0g0p0B1v0,0.011z1B1D1B0L1J1L1H0L0g0d0i111I0x1i0L0U0)140b0v0u0s0/0F011N1x010k0$0B0s0u0A0B1H1/1;1_1P1|1L1 210@0a0r0E0x0d0v0d0b0P170s0r0Y1-0x0x0B0h2m1a240s1i0n1+2z0L1)1(1*0i260/1D0s1~2j1H1s1u0*1O2J0P2L0s1#1t1H0v2s1i2x2z2%0`1:2n2R1`2W0x0~0p0@0r0y2w2+0^2*252-1P2/2;2?0F2_1;2{2x2I01300u2=040r0c342y0_372~0/3a3c0r0H3g362+383m2?0T3q3i3s3k390d2:3b2?0W3x2|2,1w2 3C313d0t3H3j3K3l3M3E3d0f3Q3z3S3B3D3n0Q3Y2}3!3u040y0o3)3J2S3#3N0y2^1b2`3y3*3=3,0y333`353|3;2.3U3c0y3f423h3I3t470@0y3p4b3r3}463$4g3w4j444e4n3-3G4q4d3A3 3P4w3R3~4f3-3X4B3Z4D4t0y3(4H4l3L4t0F3/4j1j2#1a2P2C0i2G380h1#221i4X1l4V2)4T4$0Y2$4I1`0N0@0Y0k3q4x3!0M2?4{4C2.0k0@0b142l0#2s504=1P0?040D5a4O3l0@1W0B0u0j5g455c0@0C3q0r4|3~0@0P0e0Y0g165o380d0@0G5D3A0N0h0@0K180B5I3!5d5s4j5u512 5x0e1|194T5W0/5F045H5$5b0/5K5M5O5Q3=5d0V0I3x0r5{5V5-014@040P4`5U5v2.5Y5A5C645%010d4~610b5t651P5/045N2L5=1`5d5_4q5|6t5}5h39670B5B0L6h6b5)5+2%6v5p0/0A0P0@4S2%066u5|6i5i615Z2U6C5~6E6X6w0s0g0@296o5q5e6*6T5k5m6-015@3x6P6R6b60626!6I6x6U686B6a6Y5G6F2`6H3t5Y5!6}5E0@0z7c3A6K4g6;6q5`6Q785J0@2s0L0j0x5#6G6S6 6/5n5,6w5d0S6;0s6y6A7k0@0R6@6t7x7G6U6K1D0B7A7w6D5G7g5R0@5f7B6~7P5y717Y3=5)0J7+666U7b7$386?736w5)0n0n7/1P7i04416O6^5{7x6{637V5~7(0e7R0P7T7~5(0@0O8g018082777x6E76357o3!806N2`7x7l6s7n865x888o6b7P7z7J047E7?4y5Y8d8f8M7Z047L7_6~8q8k8H0u1K5l7U8x6b7D7F8O0$8e8%8s8p0@7.8V38803_2)8)7K6r6O7n6u8C047r7t7v8F8a54560!0P598R5?7!8+048I9e6p5r8Y8,7S8/2y8t7,8=8k8m8J5T896#7a6W9k6+0V7m6Q920B0%5P9D0/8z8 906_5~60947u9n04551D9b9d8{5~5d7#9$9A9i8!1L6:9M6=9m8@8N706z699*6~5S9W5y8P9q3d8;048?9z6~8_8J9F8A856`0@9J0b9L9{7@0@8~3{90926|9?3+5j9-8$8J8Lai9@9 8-8Qax8S8Ua67d5*8r9r7Oas8#9/aC9f8K9haz9p8k7-9v6L3-8J0Ral439Q9R6w9T0Z959W9Y579cah8(9%9g9:8ZaMa18y9=aFay5z9_72aO9l049y979+aS8.a99G91ad04afa;35a|04a#3ha%ac9S7qa+9Vaq5w9X9a58bh2ybj9)a=9+9jb36+b68:8G9obabt1`aVbM7 aX8`bC9|a}b77%9B96bi8|04aa6O1a4/0B2z2!b+4W1t4Y2C2E2A1!1$2Cat2z4X0_0n0Y9b0%04.
.128013s3o8bcdufvg/ly napSr1me,(P2=4tki9][5h)6050h0x0E0r0G0n0b0p0g0n0r0b0b0C010E0G0s010406050b0i0w0w0r0u0o040t0d0n0i0(0d0q050m0/0;0?0^0-0s041118051b0m1b1d180-0h0G0k0W0Y0!0$0L0G0l0L0n1r0L0E0+050R0f0n0x1m0Z0#011q1s1u1s0E1A1C1y0E0f0d0h0^1z0u190E0L0W0{0b0s0r0q0$0B011E1o010j0T0x0q0r0w0x1y1$1(1-1G1:1C1?1^0+0a0p0A0u0d0s0d0b0G0~0q0p0P1!0u0u0x0g2d111{0q190m1Y2q0E1W1V1X0h1}0$1u0q1=2a1y1j1l0X1F2A0G2C0q1S1k1y0s2j192o2q2U0.1%2e2I1.2N0u0=0n0+0v2n2Y0,2X1|2!1G2$2(0+0B2,1(2.2o2z012?0r2)040c2`2p0-2}2;0$30320D352q2R0x2q2G2t0h2x2~0g1S1_193j1c2S2/2p3e053o0P2T2Y2~0F0+1F0x0u0E3e0p3v2~0q0+0b0{2c0S2j3x381n1G0*040z0J3V3C39010w0G0+0H3%2:3X0$3Z0I0M3K3M3)0d0+0C0C3_3W2J3*3,043.122-373(3;013E043G3I404a423O043Q1u0R0G3U472{3`4b3Z3#3/2Z4b3+0+0N4x2~3Z0y4h3:424A044C4r3w411.4F4H4y4J44462W4P3Y0+3@4S2~3|043~4$3)4K4W484t424d4f3J4N043L4Y3a3P3R4o4q4X4i4Q0+4w4^4:1.4K2+564{014R4^4`521G594D3)5e2U5g4I58440K5k4u0+4G5f575i444M515p4Z045w5n5y0$4K5B2-5I5d4!3^5x5c4(4*5R5h5J5r3e495D0$4=0!3H4@5H5c4k4m3S4p0x5t424v3$5b5W432^5=535F4+4z440e5}5E5G2-5o4T5q0+635_5#5O5 5V6e4K5s6d6965604U0+6k5C6m3=5v6o6a33646u6g5+5`4K346l4E5P6w1G5T3 6h6t5{042_4^0-0m3z3h1a3u0m3s2r3l112u2t1R1T2t0r1B6W6Z1k2.6Z0Q0S0U04.
Aide
On peut tout d'abord constater que :
avant le nombre solitaire, le premier membre de chaque couple est à un indice
pair et le second à un indice impair ;
après le nombre solitaire, le premier membre de chaque couple est à un indice
impair et le second à un indice pair
Il est possible d'utiliser cette observation afin de mettre en place une méthode « Diviser pour régner » inspirée de la recherche dichotomique :
on définit une zone de recherche entre i_debut et i_fin ;
on calcule l'indice de la valeur du milieu de la zone de recherche ;
si l'indice du milieu est pair et que la valeur suivante est égale, le nombre solitaire se trouve plus loin ;
si l'indice du milieu est impair et que la valeur suivante est égale, le nombre solitaire se trouve avant ;
on ne détaille pas les deux autres cas de figure
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)