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

.128013nmwOgPoC,}6]uRèa8bsr[vcej-1SQ9_d(xiyk02; 5à+l4t/.E3)fïh{:?=é7qDp050G0y0V0q0J0T0t0P0x0T0q0t0t0+010V0J0:010406050t0n0c0c0q0u0K040C0h0T0n140h0b0P020q0c0:0O0P0o0y1e0u0.0n0y0t050W1b1d1f1h190:041F1M051P0W1P1R1M190G0J0w0|0~10120%0J0f0%0T1)0%0V17050@0s0T0y1!0 11011(1*1,1*0V1=1@1:0V0s0h0G1h1;0u1N0V0%0|1k0t0:0q0b120N011_1$010#0_0y0b1s0y1:2h2j2o1{2r1@2u0c2w040a0P0g0u0h0:0h0t0J1n1p0=2f0u0u0y0x2R1F2y0b1N0W2d2%0V2b2a2c0G2A121,0b2t2O1:1X1Z0}1`2;0J2?0b271Y1:0:2W1N2#2%381a2i1p2|2p310u1e0T170P0B2!3c183b2z3e1{3g3i3k0N3n2j3p2#2:013u0q3j040P0Z3y2$193B3s123E3G0P0U3K3A3c3C3Q3k0Q3U3M3W3O3D0h3h3F3k0l3#3q3d1#3t3*3v3H0-3/3N3=3P3@3,3H0r3{3%3}3)3+3R0E433r453Y040B0M4a3;2}463^0B3m1G3o3$4b4j4d0B3x4o3z4q4i3f3 3G0B3J4w3L3:3X4B170B3T4F3V4r4A474K3!4N1O361F2`2*0G2.3C0x272G0;1Y1N350y373o3U054%0=4/4P1{0L170=0#4;3|4j0d3k4 444s0#170T0:0`0t0x544_1216040H5e4z3t170V0y0I5o0F0q5k3C5h0j3U0P4H3(0b5n5p5r0s5u3(5h0!0)3#0P5N5z502p4{044}5H45523H5V56585a100x0F2W5d4U5Q1{5h5j5,553f5n0^0T1@5s5Z2p5w5y5A4c5@0_5`5G5;5f015J5L4N065O6d5P5=4`170J4~4N6f675C040@630y5{6l604j0h170+0+5 5-120c0J174g6u6C010h5X3*6B6g3P625_6s65386m5l126x046z6O676E6G5|5.176a386c6e6:6v5R172W0V0n0u0b6$6X016(046H6.6:5N6=6h046j6}5v175:3a6J6o6q6S6t7e6P68175x6I7l7g5^646*5g170!7a3(6L17310V7y457A786|7p6n581o0f1C6`1E666~5h6-4p746e76125S797J6~7g5E6s5t7R7b040v7u3D6R5`7+6V7Y6K170A7E4j704n7k675h0m7}2p6Z6#7$3X5D5q6T7:5h7/7,5B7=8d897z7{851{7 8e170m7U4x7W7W7_6o0T7M7O0u7Q817S170v7d4:7f8j7j8K7l5~8l616p7s8k8F7-0!848R6w6y8o6D6F4e8%7`040S8+8z5$5c5)2X8r5i7:7r6r8N3z6W3C6Z7|8!2p8q8h458Q7^8L8T8|6U3o8 8m0492997l958W5I7w5M8w756J5S0y0`0y8^8u3L9q6;9a8A0b7N0y7P8^8I8`8M7@8O827n8/8M9d3z7_5J8Z9j67878/0s171e0I8^8J8v9A8x9C8;5(5*9)9K9b7i9M8~7_918+9l9N8G047o9X7%9R8^0!a29e8y5#5b9:8@964j5/9?7h7?8^a89`9aaj8Va96J9|938p8)809 8X9p9,9r8P9o6b9-7l5S6^6`7Ia38a049D9F9Haf5}8H9*2$aa9@akaS6+a19QaYaq9T6J9V3#6/aC7KaO8B9G8D8+9Zau7v040(0kaA9f45aI0?aKa%59ac8?5+9m977c8`9#aO2t9=a!6Q6p7)8}aWa+7wam2$b04sbe2Dbhba4s8b5Fa67x6b1F4?4.4VbG0W4Y1F0V4!bL2,2(26282*0q1?bI4Y1L4^6~2W0c0F0#0q0L6s0%0Z171x1z1B1D0P9y2%1V1Q040/2j0{0~0P0#1o2Y0J1o0P352 0x153F1^c54%1d2t0x1^2i0u0|0u0,0yck1@0P1Xc31o2u0J2W5zbFa;9E8C7Qcz0P2 2Q0Jcb2F0b0V0P0w0J2T1B0Jc6co2F210u0qcr1^051y040c0,0c0h0$0tco1Fc$0X060e1p0~0bch0P2t1b2Q1^1@0{0q0:0:9u0{cm0x7P6j0{2t0Pc-cZ1e0b0G2jcMb;6Sc{0tcMb aP8CcZ0Pb 5a0nb~a=dd0hdx0Ac}5o2f1d0n2?ddcS0T00cd1o2P0G0p2W060VdB5ob~b=1@cWb=2T0x0%0qb;0P5o8cb?cy4(aO9/b80H2D0Hd-5r0qa7du2td`bl0s0!bCcE0*1O3p1M0i0hcfducY0tdB0t0Ac1c_2RdncMd7d90w0y0jcF0Ten0P262S1^0G0,0s1mcoc61f0PdI0|0 dt0s0 0yc;0i001DcM0Jc9d eK0{dBdu00eJ0=0{0=0n0Id,7)0{dJ4%cL0J2tcM0q0nd83d1f0q2YdSeP0Pb|0b0{c`0x0 etc52W0b0w0he?crcw2X5ocKcM4=4(3C1}1+1-1/bZ3C70724:0Wcz0Xe8bYc?cN0,0u6jffc|0nc~0Pd+cqf7d10P0,0V0,d,cX2QfUe!310b0X2JdBckchb c5de0=dg2T2Pee1!fUfm4@d`8U5setap0Fe3bEd;060beSdoeG0{350,c-cLeAb}eXcs2Rcvcxf^4.dra?cDd;fA1Se91icS0xg5dp1^fPet0_c0e_cM2+0^5of)0?dFcecj0^eg1p6ab_0n0T3p1,04f;d0cZ6{e?8DeKcXe 2Wf5dPcPfFgadAcLcF0=e=b;0tf91p2i101^e_e,f7g(0Vf0g8d70,g?0VdbdpdN1p0q0zdWc!bFfo1-1 1.2x9kaw4;fyd;0Pe_0Pcm1b0T0@cM0O1FgV19gVgXb=h1e~h3g*fg0#0#f0cLg`fR6_1Xc d$9Gh0eLg9c90tg/cje#0,f!0x0,f$fD5ae~gdf4gfeVgh0^cxcqhwgShzeXdw0{0fcXdhgqhD1FgSgs0D1Cevd+eg2QeXfPc{fc0J0t0q0f0,etb 0wcb6`ew0J1dh7cIfje@dddV0x0Lcncrgecqggc40bgihhd;gmaRfzfBb`0Yezg!eF1,9GhRfbfdffiritckfNhccNe?g;0G002 h$2Wckdih?iJh^iLiN0Pe!f*cqcRhSgGcr0,0z0Rc6hwe@ePiTbJ0?5^0t04.

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

.128013nmwOgPoC,}6]uRèa8bsr[vcej-1SQ9_d(xiyk02; 5à+l4t/.E3)fïh{:?=é7qDp050G0y0V0q0J0T0t0P0x0T0q0t0t0+010V0J0:010406050t0n0c0c0q0u0K040C0h0T0n140h0b0P020q0c0:0O0P0o0y1e0u0.0n0y0t050W1b1d1f1h190:041F1M051P0W1P1R1M190G0J0w0|0~10120%0J0f0%0T1)0%0V17050@0s0T0y1!0 11011(1*1,1*0V1=1@1:0V0s0h0G1h1;0u1N0V0%0|1k0t0:0q0b120N011_1$010#0_0y0b1s0y1:2h2j2o1{2r1@2u0c2w040a0P0g0u0h0:0h0t0J1n1p0=2f0u0u0y0x2R1F2y0b1N0W2d2%0V2b2a2c0G2A121,0b2t2O1:1X1Z0}1`2;0J2?0b271Y1:0:2W1N2#2%381a2i1p2|2p310u1e0T170P0B2!3c183b2z3e1{3g3i3k0N3n2j3p2#2:013u0q3j040P0Z3y2$193B3s123E3G0P0U3K3A3c3C3Q3k0Q3U3M3W3O3D0h3h3F3k0l3#3q3d1#3t3*3v3H0-3/3N3=3P3@3,3H0r3{3%3}3)3+3R0E433r453Y040B0M4a3;2}463^0B3m1G3o3$4b4j4d0B3x4o3z4q4i3f3 3G0B3J4w3L3:3X4B170B3T4F3V4r4A474K3!4N1O361F2`2*0G2.3C0x272G0;1Y1N350y373o3U054%0=4/4P1{0L170=0#4;3|4j0d3k4 444s0#170T0:0`0t0x544_1216040H5e4z3t170V0y0I5o0F0q5k3C5h0j3U0P4H3(0b5n5p5r0s5u3(5h0!0)3#0P5N5z502p4{044}5H45523H5V56585a100x0F2W5d4U5Q1{5h5j5,553f5n0^0T1@5s5Z2p5w5y5A4c5@0_5`5G5;5f015J5L4N065O6d5P5=4`170J4~4N6f675C040@630y5{6l604j0h170+0+5 5-120c0J174g6u6C010h5X3*6B6g3P625_6s65386m5l126x046z6O676E6G5|5.176a386c6e6:6v5R172W0V0n0u0b6$6X016(046H6.6:5N6=6h046j6}5v175:3a6J6o6q6S6t7e6P68175x6I7l7g5^646*5g170!7a3(6L17310V7y457A786|7p6n581o0f1C6`1E666~5h6-4p746e76125S797J6~7g5E6s5t7R7b040v7u3D6R5`7+6V7Y6K170A7E4j704n7k675h0m7}2p6Z6#7$3X5D5q6T7:5h7/7,5B7=8d897z7{851{7 8e170m7U4x7W7W7_6o0T7M7O0u7Q817S170v7d4:7f8j7j8K7l5~8l616p7s8k8F7-0!848R6w6y8o6D6F4e8%7`040S8+8z5$5c5)2X8r5i7:7r6r8N3z6W3C6Z7|8!2p8q8h458Q7^8L8T8|6U3o8 8m0492997l958W5I7w5M8w756J5S0y0`0y8^8u3L9q6;9a8A0b7N0y7P8^8I8`8M7@8O827n8/8M9d3z7_5J8Z9j67878/0s171e0I8^8J8v9A8x9C8;5(5*9)9K9b7i9M8~7_918+9l9N8G047o9X7%9R8^0!a29e8y5#5b9:8@964j5/9?7h7?8^a89`9aaj8Va96J9|938p8)809 8X9p9,9r8P9o6b9-7l5S6^6`7Ia38a049D9F9Haf5}8H9*2$aa9@akaS6+a19QaYaq9T6J9V3#6/aC7KaO8B9G8D8+9Zau7v040(0kaA9f45aI0?aKa%59ac8?5+9m977c8`9#aO2t9=a!6Q6p7)8}aWa+7wam2$b04sbe2Dbhba4s8b5Fa67x6b1F4?4.4VbG0W4Y1F0V4!bL2,2(26282*0q1?bI4Y1L4^6~2W0c0F0#0q0L6s0%0Z171x1z1B1D0P9y2%1V1Q040/2j0{0~0P0#1o2Y0J1o0P352 0x153F1^c54%1d2t0x1^2i0u0|0u0,0yck1@0P1Xc31o2u0J2W5zbFa;9E8C7Qcz0P2 2Q0Jcb2F0b0V0P0w0J2T1B0Jc6co2F210u0qcr1^051y040c0,0c0h0$0tco1Fc$0X060e1p0~0bch0P2t1b2Q1^1@0{0q0:0:9u0{cm0x7P6j0{2t0Pc-cZ1e0b0G2jcMb;6Sc{0tcMb aP8CcZ0Pb 5a0nb~a=dd0hdx0Ac}5o2f1d0n2?ddcS0T00cd1o2P0G0p2W060VdB5ob~b=1@cWb=2T0x0%0qb;0P5o8cb?cy4(aO9/b80H2D0Hd-5r0qa7du2td`bl0s0!bCcE0*1O3p1M0i0hcfducY0tdB0t0Ac1c_2RdncMd7d90w0y0jcF0Ten0P262S1^0G0,0s1mcoc61f0PdI0|0 dt0s0 0yc;0i001DcM0Jc9d eK0{dBdu00eJ0=0{0=0n0Id,7)0{dJ4%cL0J2tcM0q0nd83d1f0q2YdSeP0Pb|0b0{c`0x0 etc52W0b0w0he?crcw2X5ocKcM4=4(3C1}1+1-1/bZ3C70724:0Wcz0Xe8bYc?cN0,0u6jffc|0nc~0Pd+cqf7d10P0,0V0,d,cX2QfUe!310b0X2JdBckchb c5de0=dg2T2Pee1!fUfm4@d`8U5setap0Fe3bEd;060beSdoeG0{350,c-cLeAb}eXcs2Rcvcxf^4.dra?cDd;fA1Se91icS0xg5dp1^fPet0_c0e_cM2+0^5of)0?dFcecj0^eg1p6ab_0n0T3p1,04f;d0cZ6{e?8DeKcXe 2Wf5dPcPfFgadAcLcF0=e=b;0tf91p2i101^e_e,f7g(0Vf0g8d70,g?0VdbdpdN1p0q0zdWc!bFfo1-1 1.2x9kaw4;fyd;0Pe_0Pcm1b0T0@cM0O1FgV19gVgXb=h1e~h3g*fg0#0#f0cLg`fR6_1Xc d$9Gh0eLg9c90tg/cje#0,f!0x0,f$fD5ae~gdf4gfeVgh0^cxcqhwgShzeXdw0{0fcXdhgqhD1FgSgs0D1Cevd+eg2QeXfPc{fc0J0t0q0f0,etb 0wcb6`ew0J1dh7cIfje@dddV0x0Lcncrgecqggc40bgihhd;gmaRfzfBb`0Yezg!eF1,9GhRfbfdffiritckfNhccNe?g;0G002 h$2Wckdih?iJh^iLiN0Pe!f*cqcRhSgGcr0,0z0Rc6hwe@ePiTbJ0?5^0t04.
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

.128013nmwOgPoC,6]uRèa8bsr[vce-1S9_d(Lxiyk02; 5à+l4t/.3)fh:=êé7qp050D0x0T0p0H0R0s0N0w0R0p0s0s0#010T0H0*010406050s0m0c0c0p0t0I040A0h0R0m0~0h0b0N020p0c0*0M0N0n0x180t0)0m0x0s050U1517191b130*041z1G051J0U1J1L1G130D0H0v0?0^0`0|0Z0H0f0Z0R1Z0Z0T11050.0r0R0x1U0_0{011Y1!1$1!0T1,1.1*0T0r0h0D1b1+0t1H0T0Z0?1e0s0*0p0b0|0L011:1W010Y0:0x0b1m0x1*2b2d2i1=2l1.2o0c2q040a0N0g0t0h0*0h0s0H1h1j0,290t0t0x0w2L1z2s0b1H0U272X0T2524260D2u0|1$0b2n2I1*1R1T0@1;2+0H2-0b211S1*0*2Q1H2V2X32142c1j2?2j2{0t180R110N0z2U3612352t381=3a3c3e0L3h2d3j2V2*013o0p3d040N0W3s2W133v3m0|3y3A0N0S3E3u363w3K3e0O3O3G3Q3I3x0h3b3z3e0k3V3k371V3n3!3p3B0(3)3H3,3J3.3$3B0q3=3X3@3Z3#3L0B3}3l3 3S040z0K443+2@403/0z3g1A3i1I301z2;2!0D2(3w0w212A0+1S1H2 0x314j4i3t054s0,4A454d0J110,0Y3O3*3w0d3e4O3?4d0b0Y110R0*0;0s0w4T3~4d10040E4(4I39110T0x0G4=0C0p4.4c2j4+0j3O0N4P3Y0b4;4?4^0r4{3w4+0X0!3V0N5f514U4:040R1i0f1w0m0t1y4C2W5h4)2j0h110#50523 4+0u593Y0c0H114a5s3B5B4J110Y3!5A5i3n110C5S5v1=0h4R042_5X4/3n0r110t2d0f0x5F5C114-5L5N395+5k2n5;4*5?5~5j4=4@0x4_611=5b5(4|5Z110Q6a3w5H114h345T0|5b0l5e5g5_1=4K045Q0t6f534;0/0R1.0C585L5u5)0|5!115%6F6r3J5{5-0b5/676m605^6l016h486T014~6x465{2x6#4+5@6k5Y3J55646D6,110X6(4d5x046e6M6X6Z6j4j6X5b5d5L065g7a6G6b6;044=1n6{5w5y7i68115E6W6:6Y5I045K327c3w6t6v7l7e5W707q6J5$0b7A3x6P5.5:7p6H6$6V6/7O0b6*5}7N7d7P4,6#547f56654`7W5a6_7I6}6 7v6N7r6i6^040X6o787b6q6X7y5R7D7S6z0:6C7)7:6X7F6L877q7T5,7L7@6.747q727@4 817X8d5|7H7*3Y6-7!6=4^868i7O698n3w7.7I8k8s5=7^7732797|7b7;6t0H4N8C6y7$6?8y4D757n8v7f6A857-110y8F7s738Y7q4+7`8b7O6}0#5z8T468w656E7R7X5D8#0.848~8)048+8{4d8G907+040l8K3i8M8N8N7;7#7g0*7@7o9d8U946B7(7@8=3i7w3Y8^8,7?9a7j6~7I7#5l6R5o5q9q938%9w9F6c989D6!8H5 9f6p9k5f8P110x0;7M9s8I9h3t9j9#7a9m557h9X4}8!9_5U8$95669|6U9Z9S6I7ka47J11180G8g931s9pa17Y9r8z8o839va08?7X6}99ao6g8-9x8mas8U9K5n0x5p5r9,9Yai8/829~am8X2W7;8;6`7{9l6X9J5m9MaD9z7;9Ca79nae9!9A3 6t2Q0T5p8rax8|5kaUaB9Nag92ag8p6+a^7Qaj3R8}ana 8t6_9y9/1z4F4z4kba0U4n1z0T4pbf2$2Y20222!0p1-bc4n1F4H7X2Q0c0C0Y0p0J650Z0W111r1t1v1x0N9.aM1M3j1G0i0-4=0N5Q0b2S0H1i0N1x0T0N2K0%5-0~0v1/0-290b0s2#0m2K1/0p1g0h5p0N0D000m2-0N200m0@1/4E4t3w1@1#1%1)bt7x5P80340Ub9040V1IbN040F1/1|0xb@0Nb/0h0w0J2db!1.0=azaVb{bI1R0Y0Yb%2n4=0=0sb_0s0y15b=0=4s17b~cF0x0v5-2K0N0p0v0h0H0t51b9c71%1_1(2r8jaua78Ea!7Ua.b38I8haHak8V8x7@aPcgci299K2-0=b,c52N3Yc8c:cb7;9caX886d9Ic{aca`b18 c}9Yd54Bd71_da0V060e371ib/0pbR0b0%2d0cc)b.0NbH0NcAbS3.0mdS2N0t0%0w5p2QbU1/b bTb!0p0*0*9)0=1v000PcE0=0v3za?0=0H0`1w0=2N0^0N0c0$2zdR1Zb b_cEdR0p0N2 dZ0%0,0b4=ckbMbsdDeeaBb!0D1i0wct1/4sejcK0xc+b|1g0:d}eAcE0m0G0Ncqb@eJ2Nddew3 dgcac=7Odk4Dch4t3Bdz0xel1P1Kcned4y5H0o2Qe70fb 0D0meKbo1.csb,e2e,0He.ew1e1ib b ex0~2n2`b!dQ0,0=ePc.1^eTcc5G7s7udxeZe%cm0gb_c+cU4!0%4=c+dSb@2#bI0w0_1x0j0NbXeD1$0s1/dS6v0cdVcX0NdYd!2P2n0we$cl13bd0-6A0s04.

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

.128013nmwOgPoC,6]uRèa8bsr[vce-1S9_d(Lxiyk02; 5à+l4t/.3)fh:=êé7qp050D0x0T0p0H0R0s0N0w0R0p0s0s0#010T0H0*010406050s0m0c0c0p0t0I040A0h0R0m0~0h0b0N020p0c0*0M0N0n0x180t0)0m0x0s050U1517191b130*041z1G051J0U1J1L1G130D0H0v0?0^0`0|0Z0H0f0Z0R1Z0Z0T11050.0r0R0x1U0_0{011Y1!1$1!0T1,1.1*0T0r0h0D1b1+0t1H0T0Z0?1e0s0*0p0b0|0L011:1W010Y0:0x0b1m0x1*2b2d2i1=2l1.2o0c2q040a0N0g0t0h0*0h0s0H1h1j0,290t0t0x0w2L1z2s0b1H0U272X0T2524260D2u0|1$0b2n2I1*1R1T0@1;2+0H2-0b211S1*0*2Q1H2V2X32142c1j2?2j2{0t180R110N0z2U3612352t381=3a3c3e0L3h2d3j2V2*013o0p3d040N0W3s2W133v3m0|3y3A0N0S3E3u363w3K3e0O3O3G3Q3I3x0h3b3z3e0k3V3k371V3n3!3p3B0(3)3H3,3J3.3$3B0q3=3X3@3Z3#3L0B3}3l3 3S040z0K443+2@403/0z3g1A3i1I301z2;2!0D2(3w0w212A0+1S1H2 0x314j4i3t054s0,4A454d0J110,0Y3O3*3w0d3e4O3?4d0b0Y110R0*0;0s0w4T3~4d10040E4(4I39110T0x0G4=0C0p4.4c2j4+0j3O0N4P3Y0b4;4?4^0r4{3w4+0X0!3V0N5f514U4:040R1i0f1w0m0t1y4C2W5h4)2j0h110#50523 4+0u593Y0c0H114a5s3B5B4J110Y3!5A5i3n110C5S5v1=0h4R042_5X4/3n0r110t2d0f0x5F5C114-5L5N395+5k2n5;4*5?5~5j4=4@0x4_611=5b5(4|5Z110Q6a3w5H114h345T0|5b0l5e5g5_1=4K045Q0t6f534;0/0R1.0C585L5u5)0|5!115%6F6r3J5{5-0b5/676m605^6l016h486T014~6x465{2x6#4+5@6k5Y3J55646D6,110X6(4d5x046e6M6X6Z6j4j6X5b5d5L065g7a6G6b6;044=1n6{5w5y7i68115E6W6:6Y5I045K327c3w6t6v7l7e5W707q6J5$0b7A3x6P5.5:7p6H6$6V6/7O0b6*5}7N7d7P4,6#547f56654`7W5a6_7I6}6 7v6N7r6i6^040X6o787b6q6X7y5R7D7S6z0:6C7)7:6X7F6L877q7T5,7L7@6.747q727@4 817X8d5|7H7*3Y6-7!6=4^868i7O698n3w7.7I8k8s5=7^7732797|7b7;6t0H4N8C6y7$6?8y4D757n8v7f6A857-110y8F7s738Y7q4+7`8b7O6}0#5z8T468w656E7R7X5D8#0.848~8)048+8{4d8G907+040l8K3i8M8N8N7;7#7g0*7@7o9d8U946B7(7@8=3i7w3Y8^8,7?9a7j6~7I7#5l6R5o5q9q938%9w9F6c989D6!8H5 9f6p9k5f8P110x0;7M9s8I9h3t9j9#7a9m557h9X4}8!9_5U8$95669|6U9Z9S6I7ka47J11180G8g931s9pa17Y9r8z8o839va08?7X6}99ao6g8-9x8mas8U9K5n0x5p5r9,9Yai8/829~am8X2W7;8;6`7{9l6X9J5m9MaD9z7;9Ca79nae9!9A3 6t2Q0T5p8rax8|5kaUaB9Nag92ag8p6+a^7Qaj3R8}ana 8t6_9y9/1z4F4z4kba0U4n1z0T4pbf2$2Y20222!0p1-bc4n1F4H7X2Q0c0C0Y0p0J650Z0W111r1t1v1x0N9.aM1M3j1G0i0-4=0N5Q0b2S0H1i0N1x0T0N2K0%5-0~0v1/0-290b0s2#0m2K1/0p1g0h5p0N0D000m2-0N200m0@1/4E4t3w1@1#1%1)bt7x5P80340Ub9040V1IbN040F1/1|0xb@0Nb/0h0w0J2db!1.0=azaVb{bI1R0Y0Yb%2n4=0=0sb_0s0y15b=0=4s17b~cF0x0v5-2K0N0p0v0h0H0t51b9c71%1_1(2r8jaua78Ea!7Ua.b38I8haHak8V8x7@aPcgci299K2-0=b,c52N3Yc8c:cb7;9caX886d9Ic{aca`b18 c}9Yd54Bd71_da0V060e371ib/0pbR0b0%2d0cc)b.0NbH0NcAbS3.0mdS2N0t0%0w5p2QbU1/b bTb!0p0*0*9)0=1v000PcE0=0v3za?0=0H0`1w0=2N0^0N0c0$2zdR1Zb b_cEdR0p0N2 dZ0%0,0b4=ckbMbsdDeeaBb!0D1i0wct1/4sejcK0xc+b|1g0:d}eAcE0m0G0Ncqb@eJ2Nddew3 dgcac=7Odk4Dch4t3Bdz0xel1P1Kcned4y5H0o2Qe70fb 0D0meKbo1.csb,e2e,0He.ew1e1ib b ex0~2n2`b!dQ0,0=ePc.1^eTcc5G7s7udxeZe%cm0gb_c+cU4!0%4=c+dSb@2#bI0w0_1x0j0NbXeD1$0s1/dS6v0cdVcX0NdYd!2P2n0we$cl13bd0-6A0s04.