Plus longues sous-suites communes

Considérons les deux « textes » "LAPIN" et "CAPRIN".

À quel point sont-ils proches ?

Pour répondre à cette question, on peut se demander quelle est la plus longue sous-suite commune à ces deux textes.

Définition

On appelle sous-suite d'une chaîne de caractères, une chaîne produite en enlevant zéro, un ou plusieurs caractères.

Par exemple, "AN" est une sous-suite de "LAPIN".

"AN' est aussi une sous-suite commune à "LAPIN" et "CAPRIN".

Dans certains cas, il peut y avoir plusieurs sous-suites communes de longueurs identiques. Par exemple les chaînes "abc" et "bac" admettent deux sous-suites communes de longueur 2 : "ac" et "bc".

On va donc plutôt calculer la longueur de la plus longue sous-suite commune aux deux textes.

La comparaison de "LAPIN" et "CAPRIN" donne ceci (sur fond vert les caractères "identiques", sur fond rouge les "différents") :

LAPIN

CAPRIN

La plus longue sous-suite commune est donc "APIN". Elle est de longueur 4.

Écrire la fonction lplssc (pour longueur plus longue sous-suite commune) qui prend en argument les deux textes à comparer (texte_a et texte_b) et renvoie la longueur de la plus longue sous-suite commune.

On propose deux versions de cette fonction : une version récursive utilisant la mémoïsation et une itérative.

Exemples
>>> lplssc("LAPIN", "CAPRIN")
4
>>> lplssc("abcd", "abcde")
4
>>> lplssc("aBaBaBaB", "aaa")
3
Aide

Une approche consiste à déterminer les longueurs des plus longues sous-suites communes de toutes les versions de chaque texte : la version à 0 caractère, la version à 1 caractère, etc. Il y a (1 + len(texte_a)) × (1 + len(texte_b)) cas à envisager.

En prenant encore une fois texte_a = "LAPIN" et texte_b = "CAPRIN", les différents cas envisagés apparaissent dans le tableau ci-dessous. On trouve dans chaque case la longueur de la plus longue sous-suite commune à chaque texte s'il s'arrêtait au caractère indiqué en début de ligne ou de colonne.

Ainsi, le 1 au bout de la double flèche est la longueur de la plus longue sous-suite commune aux textes "LA" et "CAPRI".

Tableau de longueurs

On constate que :

  • la première colonne et la première ligne du tableau ne contiennent que des 0. C'est en effet la longueur de la plus longue sous-suite commune dans le cas où l'un des textes est vide ;

  • si les derniers caractères considérés sont identiques, ce caractère commun fait partie de la sous-suite commune. On peut le supprimer et ajouter 1 au résultat de la case au dessus à gauche (flèche en diagonale);

  • si les derniers caractères considérés diffèrent, l'un des deux caractères (ou les deux) ne fait pas partie de la sous-suite commune. On compare les valeurs des cases de gauche et du dessus (flèches horizontale et verticale).

Version récursive

Cette fonction fait appel à la fonction récursive lplssc_rec qui prend en paramètres le nombre de caractères de chaque texte à comparer taille_a et taille_b. Cette fonction renvoie la longueur de la plus longue sous-suite commune aux taille_a premiers caractères de texte_a et aux taille_b premiers caractères de texte_b.

Par exemple, avec texte_a = "LAPIN" et texte_b = "CAPRIN", l'appel lplssc_rec(2, 5) renvoie la longueur de la plus longue sous-suite commune à "LA" et "CAPRI".

On gardera trace des résultats intermédiaires dans un dictionnaire longueurs qui, à chaque couple (taille_a, taille_b), associe la longueur de la plus longue sous-suite commune.

La fonction étant récursive, on débutera par l'appel prenant en compte tous les caractères de chaque texte.

###(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

.128013b?qOï,9vià3o_x;}jlpwf( g0]6-)2s1+8ené4è[Em5tCRPhk:c.a=ryDSu/7{Qd050:0J0S0#0j0s0F0x0Z0s0#0F0F0$010S0j0t010406050F0+0Q0Q0#0%0(040*0m0s0+140m0K0x020#0Q0t0p0x0U0J1e0%0d0+0J0F050,1b1d1f1h190t04051M1F1P0,1M190:0j0i0|0~10120W0j0y0W0s1%0W0S17050@0b0s0J1Y0 11011$1(1*1(0S1:1=1.0S0%1N0S0W0|1k0F0t0#0K120E011@1!010v0_0J0K1s0J1.2a2c2h1_2k1=2n0Q2p040a0x0V0%0m0t0m0F0j1n1p0=280%0%0J0Z2K1F2r0K1N0,262W2325241/0:2t121*0K2m2H1.1V1X0}1^2*0j2,0K0m2:1.0t2P1N2U2W311a2b1p2=2i2`0%1e0s170x0G2T3518342s371_393b3d0E3g2c3i2U2)013n0#3c040x0l3r2V193u3l123x3z0x0M3D3t353v3J3d0R3N3F3P3H3w0m3a3y3d0B3U3j361Z3m3Z3o3A0-3(3G3+3I3-3#3A0I3;3W3?3Y3!3K0h3|3k3~3R040G0z433*2?3 3.0G3f1G3h3V444c460G3q4h3s4j4b383^3z0G3C4p3E3)3Q4u170G3M4y3O4k4t404D3T4G1Q2 1F2:2Z0:252(3X0Z2{2z0;1W1N2~0J303h3N054X0=4)4I1_0X170=0v4+3=4c0u3d4_3}4l0v170s0t0`0F0Z4~4:1216040w584s3m170S0J0o5i0n0#5e3v5b0g3N0x4A3X0K5h5j5l0b5o3X5b0D0Y3U0x5H5t4`2i4=044@5B3~4|3A5P505254100Z0n2P574N5K1_5b5d5$4 385h0^0s1=5m5T2i5q5s5u455.0_5;5A5+59015D5F4G065I675J5,4;170j4^4G69615w040@5}0J5=6f5`4c0m170$0$5_5%120Q0j17496o6w010m5R3Z6v6a3I5|5:6m5 316g5f126r046t6I616y6A5?5(17643166686*6p5L172P0S0+0%0K6W6R016Y046B6(6*5H6,6b046d6@5p175*336D6i6k6M6n786J62175r6C7f7a5/5~6!5a170D743X6F172`0S7s3~7u726?7j6h521o0y1C6;1E606^5b6%4i6~6870125M737D6^7a5y6m5n7L75040O7o3w6L5;7#6P7S6E170C7y4c6`4g7e615b0A7@2i6T6V7W3Q5x5k6N7*5b7)7$5v7,87837t7=7 1_7_88170A7O4q7Q7Q7:6i0s7G7I0%7K7{7M170O774*798d7d8E7f5^8f5{6j7m8e8z7%0D7~8L6q6s8i6x6z478X7;040H8#8t5W565Z2Q8l5c7*7l6l8H3s6Q3v6T7?8U2i8k8b3~8K7/8F8N8?6O3h8_8g048|937f8 8Q5C7q5G8q6 6D5M0J0`0J8/8o3E9k6+948u0K7H0J7J8/8C8;8G7.8I7|7h8)8G973s7:5D8T9d61818)0b171e0o8/8D8p9u8r9w8+5Y5!9Z9E957c9G8^7:8{8#9f9H8A047i9R7X9L8/0D9|988s5V559*8.904c5)9-7b7-8/a29;94ad8Pa36D9?8}8j8Z7`9_8R9j9$9l8J9i659%7f5M6/6;7C9}84049x9z9Ba95@8B9!2Va49.aeaM6#9{9KaSak9N6D9P3U6)aw7EaI8v9A8x8#9Tao7p040.0qau993~aC0?aEaX53a68-5#9g91768;9VaI2m9,aU6K6j7Z8@aQa#7qag2Va`4lb82wbbb44l855za07r651F4-4(4ObA0,4R1F0S4TbF2$2X0#1;bC4R1L4/6^2P0Q0n0v0#0X6m0W0l171x1z1B1D0x9s2W1T1O040)2c0{0~0x0v1o2R0j1o0x2~2^0Z153y1?b|4X1d2m0Z1?2b0%0|0%0L0Jcb1=0x1Vb`1o2n0j2P5tbza+9y8w7Kcq0x2^2J0jc22y0K0S0x0i0j2M1B0jb}cf2y1 0%0#ci1?051y040Q0L0Q0m0f0Fcf1FcT0!060e1p0~0Kc80x2m1b2J1?1=0{0#0t0t9o0{cd0Z7J6d0{2m0xc!cQ1e0K0:2ccDb(6Mc/0FcDb?aJ8wcQ0xb?540+b=a,d40mdo0Cc;5i281d0+2,d4cJ0s00c41o2I0:0N2P060Sds5ib=b)1=cNb)2M0Z0W0#b(0x5i86b*cp4YaI9)b20w2w0wd!5l0#a1dl2md.bf0b0Dbwcv0c1Q3i1M0T0mc6dlcP0Fds0F0Cb^c-2KdecDc~d00i0J0gcw0see0x0bb|2M0:0L0b1mcfb}1f0xdz0|0 dk0b0 0Jc(0T001DcD0jc0d?eB0{dsdl00eA0=0{0=0+0odZ7Z0{dA4XcC0j2mcD0#0+c 361f0#2RdJeG0xb:0K0{c.0Z0 ekb|2P0K0i0me*cicn2Q5icBcD4,4Y3v1{1)1+1-bQ3v6`6|4*0,cq0!d bPc*cE0L0%6df6c:0+c=0xdYche~c^0x0L0S0LdZcO2JfLeR2`0K0!2Cdscbc8b?b|d50=d72M2Ie51YfLfd4.d.8O5mekaj0nd`byd(060KeJdfex0{2~0Lc!cC1?d9e{eOcj2Kcmcof,4(dia-cud(fr1Se01icJ0Zf|dg1?fGek0_b@e-cD230^5ifW0?dwc5ca0^e71p64b-0+0s3i1*04f(c@cQ6=e*8xeBcOe?2Pe|dGcGfwg1drcCcw0=e)b(0Ff01p2b101?e-eZe~gW0Se@f c~0Lg+0Sd2dgdE1p0#0rdNcRbzff1+1}1,2q9eaq4+fpd(0xe-0xcd1b0s0@cD0p1FgN19gNgPb)g_e=g{gYf70v0ve@cCg/fI6:1Vc?dT9Ag^eCg0c00Fg%caeS0LfR0Z0LfTfu54e=g4b;g7eMg90^cochhogKhreOdn0{0ycOd8gihv1FgKgk0/1CemdYe72JeOfGc/f30j0F0#0y0Lekb?0ic26;en0j1dg czfae+d4dM0Z0Xcecih+chg8b{0Kgah9d(geaLfqfsb.0P2Lcf0KgTdle*0+hJf2f4f6ijilcbfEh4cEe*g)0:002^hU2Pcbg5dPf7ckiEh/c30+0|9ochcIhKgyci0L0r0kb}hoe+eGiLbD0?5/0F04.

###(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

.128013b?qOï,9vià3o_x;}jlpwf( g0]6-)2s1+8ené4è[Em5tCRPhk:c.a=ryDSu/7{Qd050:0J0S0#0j0s0F0x0Z0s0#0F0F0$010S0j0t010406050F0+0Q0Q0#0%0(040*0m0s0+140m0K0x020#0Q0t0p0x0U0J1e0%0d0+0J0F050,1b1d1f1h190t04051M1F1P0,1M190:0j0i0|0~10120W0j0y0W0s1%0W0S17050@0b0s0J1Y0 11011$1(1*1(0S1:1=1.0S0%1N0S0W0|1k0F0t0#0K120E011@1!010v0_0J0K1s0J1.2a2c2h1_2k1=2n0Q2p040a0x0V0%0m0t0m0F0j1n1p0=280%0%0J0Z2K1F2r0K1N0,262W2325241/0:2t121*0K2m2H1.1V1X0}1^2*0j2,0K0m2:1.0t2P1N2U2W311a2b1p2=2i2`0%1e0s170x0G2T3518342s371_393b3d0E3g2c3i2U2)013n0#3c040x0l3r2V193u3l123x3z0x0M3D3t353v3J3d0R3N3F3P3H3w0m3a3y3d0B3U3j361Z3m3Z3o3A0-3(3G3+3I3-3#3A0I3;3W3?3Y3!3K0h3|3k3~3R040G0z433*2?3 3.0G3f1G3h3V444c460G3q4h3s4j4b383^3z0G3C4p3E3)3Q4u170G3M4y3O4k4t404D3T4G1Q2 1F2:2Z0:252(3X0Z2{2z0;1W1N2~0J303h3N054X0=4)4I1_0X170=0v4+3=4c0u3d4_3}4l0v170s0t0`0F0Z4~4:1216040w584s3m170S0J0o5i0n0#5e3v5b0g3N0x4A3X0K5h5j5l0b5o3X5b0D0Y3U0x5H5t4`2i4=044@5B3~4|3A5P505254100Z0n2P574N5K1_5b5d5$4 385h0^0s1=5m5T2i5q5s5u455.0_5;5A5+59015D5F4G065I675J5,4;170j4^4G69615w040@5}0J5=6f5`4c0m170$0$5_5%120Q0j17496o6w010m5R3Z6v6a3I5|5:6m5 316g5f126r046t6I616y6A5?5(17643166686*6p5L172P0S0+0%0K6W6R016Y046B6(6*5H6,6b046d6@5p175*336D6i6k6M6n786J62175r6C7f7a5/5~6!5a170D743X6F172`0S7s3~7u726?7j6h521o0y1C6;1E606^5b6%4i6~6870125M737D6^7a5y6m5n7L75040O7o3w6L5;7#6P7S6E170C7y4c6`4g7e615b0A7@2i6T6V7W3Q5x5k6N7*5b7)7$5v7,87837t7=7 1_7_88170A7O4q7Q7Q7:6i0s7G7I0%7K7{7M170O774*798d7d8E7f5^8f5{6j7m8e8z7%0D7~8L6q6s8i6x6z478X7;040H8#8t5W565Z2Q8l5c7*7l6l8H3s6Q3v6T7?8U2i8k8b3~8K7/8F8N8?6O3h8_8g048|937f8 8Q5C7q5G8q6 6D5M0J0`0J8/8o3E9k6+948u0K7H0J7J8/8C8;8G7.8I7|7h8)8G973s7:5D8T9d61818)0b171e0o8/8D8p9u8r9w8+5Y5!9Z9E957c9G8^7:8{8#9f9H8A047i9R7X9L8/0D9|988s5V559*8.904c5)9-7b7-8/a29;94ad8Pa36D9?8}8j8Z7`9_8R9j9$9l8J9i659%7f5M6/6;7C9}84049x9z9Ba95@8B9!2Va49.aeaM6#9{9KaSak9N6D9P3U6)aw7EaI8v9A8x8#9Tao7p040.0qau993~aC0?aEaX53a68-5#9g91768;9VaI2m9,aU6K6j7Z8@aQa#7qag2Va`4lb82wbbb44l855za07r651F4-4(4ObA0,4R1F0S4TbF2$2X0#1;bC4R1L4/6^2P0Q0n0v0#0X6m0W0l171x1z1B1D0x9s2W1T1O040)2c0{0~0x0v1o2R0j1o0x2~2^0Z153y1?b|4X1d2m0Z1?2b0%0|0%0L0Jcb1=0x1Vb`1o2n0j2P5tbza+9y8w7Kcq0x2^2J0jc22y0K0S0x0i0j2M1B0jb}cf2y1 0%0#ci1?051y040Q0L0Q0m0f0Fcf1FcT0!060e1p0~0Kc80x2m1b2J1?1=0{0#0t0t9o0{cd0Z7J6d0{2m0xc!cQ1e0K0:2ccDb(6Mc/0FcDb?aJ8wcQ0xb?540+b=a,d40mdo0Cc;5i281d0+2,d4cJ0s00c41o2I0:0N2P060Sds5ib=b)1=cNb)2M0Z0W0#b(0x5i86b*cp4YaI9)b20w2w0wd!5l0#a1dl2md.bf0b0Dbwcv0c1Q3i1M0T0mc6dlcP0Fds0F0Cb^c-2KdecDc~d00i0J0gcw0see0x0bb|2M0:0L0b1mcfb}1f0xdz0|0 dk0b0 0Jc(0T001DcD0jc0d?eB0{dsdl00eA0=0{0=0+0odZ7Z0{dA4XcC0j2mcD0#0+c 361f0#2RdJeG0xb:0K0{c.0Z0 ekb|2P0K0i0me*cicn2Q5icBcD4,4Y3v1{1)1+1-bQ3v6`6|4*0,cq0!d bPc*cE0L0%6df6c:0+c=0xdYche~c^0x0L0S0LdZcO2JfLeR2`0K0!2Cdscbc8b?b|d50=d72M2Ie51YfLfd4.d.8O5mekaj0nd`byd(060KeJdfex0{2~0Lc!cC1?d9e{eOcj2Kcmcof,4(dia-cud(fr1Se01icJ0Zf|dg1?fGek0_b@e-cD230^5ifW0?dwc5ca0^e71p64b-0+0s3i1*04f(c@cQ6=e*8xeBcOe?2Pe|dGcGfwg1drcCcw0=e)b(0Ff01p2b101?e-eZe~gW0Se@f c~0Lg+0Sd2dgdE1p0#0rdNcRbzff1+1}1,2q9eaq4+fpd(0xe-0xcd1b0s0@cD0p1FgN19gNgPb)g_e=g{gYf70v0ve@cCg/fI6:1Vc?dT9Ag^eCg0c00Fg%caeS0LfR0Z0LfTfu54e=g4b;g7eMg90^cochhogKhreOdn0{0ycOd8gihv1FgKgk0/1CemdYe72JeOfGc/f30j0F0#0y0Lekb?0ic26;en0j1dg czfae+d4dM0Z0Xcecih+chg8b{0Kgah9d(geaLfqfsb.0P2Lcf0KgTdle*0+hJf2f4f6ijilcbfEh4cEe*g)0:002^hU2Pcbg5dPf7ckiEh/c30+0|9ochcIhKgyci0L0r0kb}hoe+eGiLbD0?5/0F04.
Version itérative

Dans cette version itérative on détermine là encore les longueurs des plus longues sous-suites communes de toutes les versions de chaque texte.

On peut toutefois remarquer que les deux formules de récurrences (derniers caractères identiques ou différents) ne font intervenir que deux lignes à la fois. On peut donc compléter le tableau ligne par ligne en partant de la première et en ne gardant trace que de la dernière ligne complétée.

Une seule ligne est nécessaire

###(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

.128013bqêO,9vià3o_x;lpwf( g0]6-)2s1+8ené4è[m5tCLRPhk:c.a=rySu/7d050*0G0O0Y0i0p0C0u0W0p0Y0C0C0Z010O0i0q010406050C0%0M0M0Y0!0#040$0l0p0%0~0l0H0u020Y0M0q0o0u0R0G180!0c0%0G0C050(1517191b130q04051G1z1J0(1G130*0i0h0?0^0`0|0T0i0v0T0p1X0T0O11050.0b0p0G1S0_0{011W1Y1!1Y0O1*1,1(0O0!1H0O0T0?1e0C0q0Y0H0|0B011.1U010s0:0G0H1m0G1(24262b1:2e1,2h0M2j040a0u0S0!0l0q0l0C0i1h1j0,220!0!0G0W2E1z2l0H1H0(202Q1}1 1~1)0*2n0|1!0H2g2B1(1P1R0@1/2!0i2$0H0l2*1(0q2J1H2O2Q2{14251j2,2c2;0!180p110u0D2N2 122~2m311:3335370B3a263c2O2Z013h0Y36040u0k3l2P133o3f0|3r3t0u0J3x3n2 3p3D370N3H3z3J3B3q0l343s370y3O3d301T3g3T3i3u0)3Y3A3#3C3%3V3u0F3+3Q3-3S3U3E0g3?3e3^3L040D0w3}3!2-3_3(0D391A3b1K2_1z2*2T0*1 2Y3R0W2=2t0+1Q1H2^0G2`4c4b3m054m0,4u3~460U110,0s3H3Z3p0r374I3,460H0s110p0q0;0C0W4N3@4610040t4Y4C32110O0G0n4,0m0Y4(452c4#0f3H0u4J3R0H4+4-4/0b4=3p4#0A0V3O0u594{4O4*040p1i0v1w0%0!1y4w2P5b4Z2c0l110Z4`4|3^4#0L533R0M0i11435m3u5v4D110s3T5u5c3g110m5M5p1:0l4L042/5R4)3g0b110!260v0G5z5w114%5F5H325#5e2g5+4!5-5^5d4,4.0G4:5{1:555Y4?5T110E643p5B114a2}5N0|550x585a5:1:4E045K0!694}4+0/0p1,0m525F5o5Z0|5U115X6z6l3C5=5%0H5)616g5`5/6f016b416N014^6r3 5=2q6V4#5.6e5S3C4 5~6x6$110A6Y465r04686G6R6T6d4c6R55575F065a746A656+044,1n6=5q5s7c62115y6Q6*6S5C045E2{763p6n6p7f785Q6`7k6D5W0H7u3q6J5(5*7j6B6W6P6)7I0H6!5@7H777J4$6V4~79505 4;7Q546:7C6@6_7p6H7l6c6/040A6i72756k6R7s5L7x7M6t0:6w7Z7*6R7z6F817k7N5$7F7.6(6~7k6|7.4_7{7R875?7B7!3R6%7U6,4/808c7I638h3p7(7C8e8m5,7/712{737?757+6n0i4H8w6s7W6-8s4x6 7h8p796u7 7%110z8z7m6}8S7k4#7;857I6@0Z5t8N3 8q5 6y7L7R5x8V0.7~8^8Z048#8=468A8`7#040x8E3b8G8H8H7+7V7a0q7.7i978O8~6v7Y7.8,3b7q3R8/8$7-947d6^7C7V5f6L5i5k9k8}8X9q9z66929x6U8B5_996j9e598J110G0;7G9m8C9b3m9d9V749g4 7b9R4@8U9:5O8W8 609?6O9T9M6C7e9~7D11180n8a8}1s9j9{7S9l8t8i7}9p9`8-7R6@93ai6a8%9r8gam8O9E5h0G5j5l9$9Sac8)7|9^ag8R2P7+8+6;7=9f6R9D5g9Gax9t7+9wa19ha89U9u3^6n2J0O5j8lar8?5eaOav9Haa8|aa8j6#a/7Kad3K8@aha_8n6:9s9)1z4z4t4db40(4g1z0O4ib92W2R0Y1+b64g1F4B7R2J0M0m0s0Y0U5 0T0k111r1t1v1x0u9(aG1M3c1G0P0-4,0u5K0H2L0i1i0u1x0O0u2D0I5%0~0h1-0-220H0C1}0%2D1-0Y1g0l5j0u0*000%2$0u0bb-0@1-4y4n3p1=1Z1#1%bk7r5J7`2}0(b3040X1KbE040Q1-1`0Gb+0ub$0l0W0U26bR1,0=ataPb/bz1P0s0sbU2g4,0=0Cb-0C0z15b)0=4m17b=cw0G0h5%2D0u0Y0h0l0i0!4{b3b~1#1@1$2k8daoa18yaU7Oa(a}8C8baBae8P8r7.aJc7c9229E2$0=bZb|2G3Rb c%c27+96aR82679Cc/a6a;a{8_c;9Sc|4vc~1@d10X060e301ib$0YbI0H0I260McWb#0uby0ucrbJ3%0%dJ2G0!0I0W5j2JbL1-b?bKbR0Y0q0q9Z0=1v000jcv0=0h3sa-0=0i0`1w0=2G0^0u0M0d2sdI1Xb?b-cvdI0Y0u2^dQ0I0,0H4,cbbDbjdue5avbR0*1i0Wck1-4meacB0GcYb:1g0:d;ercv0%0n0uchb+eA2Gd4en3^d7c1c)7Idb4xc84n3udq0Gec1N1Icee44s5B0K2Jd~0vb?0*0%eBbf1,cjbZd_eZ0ie#en1e1ib?b?eo0~2g2:bRdH0,0=eGc#1?eKc35A7m7odoeQeUcd0Sb-cYcL4U0I4,cYdJb+1}bz0W0_1x0f0ubOeu1!0C1-dJ6p0MdMcO0udPdR2I2g0WeTcc13b70-6u0C04.

###(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

.128013bqêO,9vià3o_x;lpwf( g0]6-)2s1+8ené4è[m5tCLRPhk:c.a=rySu/7d050*0G0O0Y0i0p0C0u0W0p0Y0C0C0Z010O0i0q010406050C0%0M0M0Y0!0#040$0l0p0%0~0l0H0u020Y0M0q0o0u0R0G180!0c0%0G0C050(1517191b130q04051G1z1J0(1G130*0i0h0?0^0`0|0T0i0v0T0p1X0T0O11050.0b0p0G1S0_0{011W1Y1!1Y0O1*1,1(0O0!1H0O0T0?1e0C0q0Y0H0|0B011.1U010s0:0G0H1m0G1(24262b1:2e1,2h0M2j040a0u0S0!0l0q0l0C0i1h1j0,220!0!0G0W2E1z2l0H1H0(202Q1}1 1~1)0*2n0|1!0H2g2B1(1P1R0@1/2!0i2$0H0l2*1(0q2J1H2O2Q2{14251j2,2c2;0!180p110u0D2N2 122~2m311:3335370B3a263c2O2Z013h0Y36040u0k3l2P133o3f0|3r3t0u0J3x3n2 3p3D370N3H3z3J3B3q0l343s370y3O3d301T3g3T3i3u0)3Y3A3#3C3%3V3u0F3+3Q3-3S3U3E0g3?3e3^3L040D0w3}3!2-3_3(0D391A3b1K2_1z2*2T0*1 2Y3R0W2=2t0+1Q1H2^0G2`4c4b3m054m0,4u3~460U110,0s3H3Z3p0r374I3,460H0s110p0q0;0C0W4N3@4610040t4Y4C32110O0G0n4,0m0Y4(452c4#0f3H0u4J3R0H4+4-4/0b4=3p4#0A0V3O0u594{4O4*040p1i0v1w0%0!1y4w2P5b4Z2c0l110Z4`4|3^4#0L533R0M0i11435m3u5v4D110s3T5u5c3g110m5M5p1:0l4L042/5R4)3g0b110!260v0G5z5w114%5F5H325#5e2g5+4!5-5^5d4,4.0G4:5{1:555Y4?5T110E643p5B114a2}5N0|550x585a5:1:4E045K0!694}4+0/0p1,0m525F5o5Z0|5U115X6z6l3C5=5%0H5)616g5`5/6f016b416N014^6r3 5=2q6V4#5.6e5S3C4 5~6x6$110A6Y465r04686G6R6T6d4c6R55575F065a746A656+044,1n6=5q5s7c62115y6Q6*6S5C045E2{763p6n6p7f785Q6`7k6D5W0H7u3q6J5(5*7j6B6W6P6)7I0H6!5@7H777J4$6V4~79505 4;7Q546:7C6@6_7p6H7l6c6/040A6i72756k6R7s5L7x7M6t0:6w7Z7*6R7z6F817k7N5$7F7.6(6~7k6|7.4_7{7R875?7B7!3R6%7U6,4/808c7I638h3p7(7C8e8m5,7/712{737?757+6n0i4H8w6s7W6-8s4x6 7h8p796u7 7%110z8z7m6}8S7k4#7;857I6@0Z5t8N3 8q5 6y7L7R5x8V0.7~8^8Z048#8=468A8`7#040x8E3b8G8H8H7+7V7a0q7.7i978O8~6v7Y7.8,3b7q3R8/8$7-947d6^7C7V5f6L5i5k9k8}8X9q9z66929x6U8B5_996j9e598J110G0;7G9m8C9b3m9d9V749g4 7b9R4@8U9:5O8W8 609?6O9T9M6C7e9~7D11180n8a8}1s9j9{7S9l8t8i7}9p9`8-7R6@93ai6a8%9r8gam8O9E5h0G5j5l9$9Sac8)7|9^ag8R2P7+8+6;7=9f6R9D5g9Gax9t7+9wa19ha89U9u3^6n2J0O5j8lar8?5eaOav9Haa8|aa8j6#a/7Kad3K8@aha_8n6:9s9)1z4z4t4db40(4g1z0O4ib92W2R0Y1+b64g1F4B7R2J0M0m0s0Y0U5 0T0k111r1t1v1x0u9(aG1M3c1G0P0-4,0u5K0H2L0i1i0u1x0O0u2D0I5%0~0h1-0-220H0C1}0%2D1-0Y1g0l5j0u0*000%2$0u0bb-0@1-4y4n3p1=1Z1#1%bk7r5J7`2}0(b3040X1KbE040Q1-1`0Gb+0ub$0l0W0U26bR1,0=ataPb/bz1P0s0sbU2g4,0=0Cb-0C0z15b)0=4m17b=cw0G0h5%2D0u0Y0h0l0i0!4{b3b~1#1@1$2k8daoa18yaU7Oa(a}8C8baBae8P8r7.aJc7c9229E2$0=bZb|2G3Rb c%c27+96aR82679Cc/a6a;a{8_c;9Sc|4vc~1@d10X060e301ib$0YbI0H0I260McWb#0uby0ucrbJ3%0%dJ2G0!0I0W5j2JbL1-b?bKbR0Y0q0q9Z0=1v000jcv0=0h3sa-0=0i0`1w0=2G0^0u0M0d2sdI1Xb?b-cvdI0Y0u2^dQ0I0,0H4,cbbDbjdue5avbR0*1i0Wck1-4meacB0GcYb:1g0:d;ercv0%0n0uchb+eA2Gd4en3^d7c1c)7Idb4xc84n3udq0Gec1N1Icee44s5B0K2Jd~0vb?0*0%eBbf1,cjbZd_eZ0ie#en1e1ib?b?eo0~2g2:bRdH0,0=eGc#1?eKc35A7m7odoeQeUcd0Sb-cYcL4U0I4,cYdJb+1}bz0W0_1x0f0ubOeu1!0C1-dJ6p0MdMcO0udPdR2I2g0WeTcc13b70-6u0C04.