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

.128013à[ï3è4.Qnx/R8p)0EhCDv7c256g9f=buS-,_l(w?OaPké;:ors1qmyd]ji{ }te+050%0/0.0Q0*0L0Y0,0x0L0Q0Y0Y0E010.0*0o010406050Y0G0#0#0Q0X0$040H0W0L0G140W0j0,020Q0#0o0U0,0m0/1e0X0!0G0/0Y050l1b1d1f1h190o041F1M051P0l1P1R1M190%0*0v0|0~10120s0*0B0s0L1)0s0.17050@0F0L0/1!0 11011(1*1,1*0.1=1@1:0.0F0W0%1h1;0X1N0.0s0|1k0Y0o0Q0j120y011_1$010D0_0/0j1s0/1:2h2j2o1{2r1@2u0#2w040a0,0R0X0W0o0W0Y0*1n1p0=2f0X0X0/0x2R1F2y0j1N0l2d2%0.2b2a2c0%2A121,0j2t2O1:1X1Z0}1`2;0*2?0j271Y1:0o2W1N2#2%381a2i1p2|2p310X1e0L170,0Z2!3c183b2z3e1{3g3i3k0y3n2j3p2#2:013u0Q3j040,0e3y2$193B3s123E3G0,0g3K3A3c3C3Q3k0z3U3M3W3O3D0W3h3F3k0A3#3q3d1#3t3*3v3H0w3/3N3=3P3@3,3H0n3{3%3}3)3+3R0C433r453Y040Z0q4a3;2}463^0Z3m1G3o3$4b4j4d0Z3x4o3z4q4i3f3 3G0Z3J4w3L3:3X4B170Z3T4F3V4r4A474K3!4N1O361F2`2*0%2.3C0x272G0;1Y1N350/373o3U054%0=4/4P1{0S170=0D4;3|4j0N3k4 444s0D170L0o0`0Y0x544_1216040M5e4z3t170.0/0k5o0K0Q5k3C5h0J3U0,4H3(0j5n5p5r0F5u3(5h0p0V3#0,5N5z502p4{044}5H45523H5V56585a100x0K2W5d4U5Q1{5h5j5,553f5n0^0L1@5s5Z2p5w5y5A4c5@0_5`5G5;5f015J5L4N065O6d5P5=4`170*4~4N6f675C040@630/5{6l604j0W170E0E5 5-120#0*174g6u6C010W5X3*6B6g3P625_6s65386m5l126x046z6O676E6G5|5.176a386c6e6:6v5R172W0.0G0X0j6$6X016(046H6.6:5N6=6h046j6}5v175:3a6J6o6q6S6t7e6P68175x6I7l7g5^646*5g170p7a3(6L17310.7y457A786|7p6n581o0B1C6`1E666~5h6-4p746e76125S797J6~7g5E6s5t7R7b040c7u3D6R5`7+6V7Y6K170I7E4j704n7k675h0(7}2p6Z6#7$3X5D5q6T7:5h7/7,5B7=8d897z7{851{7 8e170(7U4x7W7W7_6o0L7M7O0X7Q817S170c7d4:7f8j7j8K7l5~8l616p7s8k8F7-0p848R6w6y8o6D6F4e8%7`040:8+8z5$5c5)2X8r5i7:7r6r8N3z6W3C6Z7|8!2p8q8h458Q7^8L8T8|6U3o8 8m0492997l958W5I7w5M8w756J5S0/0`0/8^8u3L9q6;9a8A0j7N0/7P8^8I8`8M7@8O827n8/8M9d3z7_5J8Z9j67878/0F171e0k8^8J8v9A8x9C8;5(5*9)9K9b7i9M8~7_918+9l9N8G047o9X7%9R8^0pa29e8y5#5b9:8@964j5/9?7h7?8^a89`9aaj8Va96J9|938p8)809 8X9p9,9r8P9o6b9-7l5S6^6`7Ia38a049D9F9Haf5}8H9*2$aa9@akaS6+a19QaYaq9T6J9V3#6/aC7KaO8B9G8D8+9Zau7v040+0-aA9f45aI0?aKa%59ac8?5+9m977c8`9#aO2t9=a!6Q6p7)8}aWa+7wam2$b04sbe2Dbhba4s8b5Fa67x6b1F4?4.4VbG0l4Y1F0.4!bL2,2(26282*0Q1?bI4Y1L4^6~2W0#0K0D0Q0S6s0s0e171x1z1B1D0,9y2%1V1Q040u2j0{0~0,0D1o2Y0*1o0,352 0x153F1^c54%1d2t0x1^2i0X0|0X0T0/ck1@0,1Xc31o2u0*2W5zbFa;9E8C7Qcz0,2 2Q0*cb2F0j0.0,0v0*2T1B0*c6co2F210X0Qcr1^051y040#0T0#0W0d0Yco1Fc$0h060P1p0~0jch0,2t1b2Q1^1@0{0Q0o0o9u0{cm0x7P6j0{2t0,c-cZ1e0j0%2jcMb;6Sc{0YcMb aP8CcZ0,b 5a0Gb~a=dd0Wdx0Ic}5o2f1d0G2?ddcS0L00cd1o2P0%0f2W060.dB5ob~b=1@cWb=2T0x0s0Qb;0,5o8cb?cy4(aO9/b80M2D0Md-5r0Qa7du2td`bl0F0pbCcE0O1O3p1M0t0WcfducY0YdB0Y0Ic1c_2RdncMd7d90v0/0JcF0Len0,262S1^0%0T0F1mcoc61f0,dI0|0 dt0F0 0/c;0t001DcM0*c9d eK0{dBdu00eJ0=0{0=0G0kd,7)0{dJ4%cL0*2tcM0Q0Gd83d1f0Q2YdSeP0,b|0j0{c`0x0 etc52W0j0v0We?crcw2X5ocKcM4=4(3C1}1+1-1/bZ3C70724:0lcz0he8bYc?cN0T0X6jffc|0Gc~0,d+cqf7d10,0T0.0Td,cX2QfUe!310j0h2JdBckchb c5de0=dg2T2Pee1!fUfm4@d`8U5setap0Ke3bEd;060jeSdoeG0{350Tc-cLeAb}eXcs2Rcvcxf^4.dra?cDd;fA1Se91icS0xg5dp1^fPet0_c0e_cM2+0^5of)0?dFcecj0^eg1p6ab_0G0L3p1,04f;d0cZ6{e?8DeKcXe 2Wf5dPcPfFgadAcLcF0=e=b;0Yf91p2i101^e_e,f7g(0.f0g8d70Tg?0.dbdpdN1p0Q0)dWc!bFfo1-1 1.2x9kaw4;fyd;0,e_0,cm1b0L0@cM0U1FgV19gVgXb=h1e~h3g*fg0D0Df0cLg`fR6_1Xc d$9Gh0eLg9c90Yg/cje#0Tf!0x0Tf$fD5ae~gdf4gfeVgh0^cxcqhwgShzeXdw0{0BcXdhgqhD1FgSgs0i1Cevd+eg2QeXfPc{fc0*0Y0Q0B0Tetb 0vcb6`ew0*1dh7cIfje@dddV0x0Scncrgecqggc40jgihhd;gmaRfzfBb`0rezg!eF1,9GhRfbfdffiritckfNhccNe?g;0%002 h$2Wckdih?iJh^iLiN0,e!f*cqcRhSgGcr0T0)0bc6hwe@ePiTbJ0?5^0Y04.

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

.128013à[ï3è4.Qnx/R8p)0EhCDv7c256g9f=buS-,_l(w?OaPké;:ors1qmyd]ji{ }te+050%0/0.0Q0*0L0Y0,0x0L0Q0Y0Y0E010.0*0o010406050Y0G0#0#0Q0X0$040H0W0L0G140W0j0,020Q0#0o0U0,0m0/1e0X0!0G0/0Y050l1b1d1f1h190o041F1M051P0l1P1R1M190%0*0v0|0~10120s0*0B0s0L1)0s0.17050@0F0L0/1!0 11011(1*1,1*0.1=1@1:0.0F0W0%1h1;0X1N0.0s0|1k0Y0o0Q0j120y011_1$010D0_0/0j1s0/1:2h2j2o1{2r1@2u0#2w040a0,0R0X0W0o0W0Y0*1n1p0=2f0X0X0/0x2R1F2y0j1N0l2d2%0.2b2a2c0%2A121,0j2t2O1:1X1Z0}1`2;0*2?0j271Y1:0o2W1N2#2%381a2i1p2|2p310X1e0L170,0Z2!3c183b2z3e1{3g3i3k0y3n2j3p2#2:013u0Q3j040,0e3y2$193B3s123E3G0,0g3K3A3c3C3Q3k0z3U3M3W3O3D0W3h3F3k0A3#3q3d1#3t3*3v3H0w3/3N3=3P3@3,3H0n3{3%3}3)3+3R0C433r453Y040Z0q4a3;2}463^0Z3m1G3o3$4b4j4d0Z3x4o3z4q4i3f3 3G0Z3J4w3L3:3X4B170Z3T4F3V4r4A474K3!4N1O361F2`2*0%2.3C0x272G0;1Y1N350/373o3U054%0=4/4P1{0S170=0D4;3|4j0N3k4 444s0D170L0o0`0Y0x544_1216040M5e4z3t170.0/0k5o0K0Q5k3C5h0J3U0,4H3(0j5n5p5r0F5u3(5h0p0V3#0,5N5z502p4{044}5H45523H5V56585a100x0K2W5d4U5Q1{5h5j5,553f5n0^0L1@5s5Z2p5w5y5A4c5@0_5`5G5;5f015J5L4N065O6d5P5=4`170*4~4N6f675C040@630/5{6l604j0W170E0E5 5-120#0*174g6u6C010W5X3*6B6g3P625_6s65386m5l126x046z6O676E6G5|5.176a386c6e6:6v5R172W0.0G0X0j6$6X016(046H6.6:5N6=6h046j6}5v175:3a6J6o6q6S6t7e6P68175x6I7l7g5^646*5g170p7a3(6L17310.7y457A786|7p6n581o0B1C6`1E666~5h6-4p746e76125S797J6~7g5E6s5t7R7b040c7u3D6R5`7+6V7Y6K170I7E4j704n7k675h0(7}2p6Z6#7$3X5D5q6T7:5h7/7,5B7=8d897z7{851{7 8e170(7U4x7W7W7_6o0L7M7O0X7Q817S170c7d4:7f8j7j8K7l5~8l616p7s8k8F7-0p848R6w6y8o6D6F4e8%7`040:8+8z5$5c5)2X8r5i7:7r6r8N3z6W3C6Z7|8!2p8q8h458Q7^8L8T8|6U3o8 8m0492997l958W5I7w5M8w756J5S0/0`0/8^8u3L9q6;9a8A0j7N0/7P8^8I8`8M7@8O827n8/8M9d3z7_5J8Z9j67878/0F171e0k8^8J8v9A8x9C8;5(5*9)9K9b7i9M8~7_918+9l9N8G047o9X7%9R8^0pa29e8y5#5b9:8@964j5/9?7h7?8^a89`9aaj8Va96J9|938p8)809 8X9p9,9r8P9o6b9-7l5S6^6`7Ia38a049D9F9Haf5}8H9*2$aa9@akaS6+a19QaYaq9T6J9V3#6/aC7KaO8B9G8D8+9Zau7v040+0-aA9f45aI0?aKa%59ac8?5+9m977c8`9#aO2t9=a!6Q6p7)8}aWa+7wam2$b04sbe2Dbhba4s8b5Fa67x6b1F4?4.4VbG0l4Y1F0.4!bL2,2(26282*0Q1?bI4Y1L4^6~2W0#0K0D0Q0S6s0s0e171x1z1B1D0,9y2%1V1Q040u2j0{0~0,0D1o2Y0*1o0,352 0x153F1^c54%1d2t0x1^2i0X0|0X0T0/ck1@0,1Xc31o2u0*2W5zbFa;9E8C7Qcz0,2 2Q0*cb2F0j0.0,0v0*2T1B0*c6co2F210X0Qcr1^051y040#0T0#0W0d0Yco1Fc$0h060P1p0~0jch0,2t1b2Q1^1@0{0Q0o0o9u0{cm0x7P6j0{2t0,c-cZ1e0j0%2jcMb;6Sc{0YcMb aP8CcZ0,b 5a0Gb~a=dd0Wdx0Ic}5o2f1d0G2?ddcS0L00cd1o2P0%0f2W060.dB5ob~b=1@cWb=2T0x0s0Qb;0,5o8cb?cy4(aO9/b80M2D0Md-5r0Qa7du2td`bl0F0pbCcE0O1O3p1M0t0WcfducY0YdB0Y0Ic1c_2RdncMd7d90v0/0JcF0Len0,262S1^0%0T0F1mcoc61f0,dI0|0 dt0F0 0/c;0t001DcM0*c9d eK0{dBdu00eJ0=0{0=0G0kd,7)0{dJ4%cL0*2tcM0Q0Gd83d1f0Q2YdSeP0,b|0j0{c`0x0 etc52W0j0v0We?crcw2X5ocKcM4=4(3C1}1+1-1/bZ3C70724:0lcz0he8bYc?cN0T0X6jffc|0Gc~0,d+cqf7d10,0T0.0Td,cX2QfUe!310j0h2JdBckchb c5de0=dg2T2Pee1!fUfm4@d`8U5setap0Ke3bEd;060jeSdoeG0{350Tc-cLeAb}eXcs2Rcvcxf^4.dra?cDd;fA1Se91icS0xg5dp1^fPet0_c0e_cM2+0^5of)0?dFcecj0^eg1p6ab_0G0L3p1,04f;d0cZ6{e?8DeKcXe 2Wf5dPcPfFgadAcLcF0=e=b;0Yf91p2i101^e_e,f7g(0.f0g8d70Tg?0.dbdpdN1p0Q0)dWc!bFfo1-1 1.2x9kaw4;fyd;0,e_0,cm1b0L0@cM0U1FgV19gVgXb=h1e~h3g*fg0D0Df0cLg`fR6_1Xc d$9Gh0eLg9c90Yg/cje#0Tf!0x0Tf$fD5ae~gdf4gfeVgh0^cxcqhwgShzeXdw0{0BcXdhgqhD1FgSgs0i1Cevd+eg2QeXfPc{fc0*0Y0Q0B0Tetb 0vcb6`ew0*1dh7cIfje@dddV0x0Scncrgecqggc40jgihhd;gmaRfzfBb`0rezg!eF1,9GhRfbfdffiritckfNhccNe?g;0%002 h$2Wckdih?iJh^iLiN0,e!f*cqcRhSgGcr0T0)0bc6hwe@ePiTbJ0?5^0Y04.
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

.128013à[3è4.ênx/R8p)L0hCv7c256g9f=buS-,_l(wOaPké;:ors1qmyd]i te+050!0)0(0N0$0J0V0%0v0J0N0V0V0C010(0$0n010406050V0E0Y0Y0N0U0Z040F0T0J0E0~0T0i0%020N0Y0n0R0%0l0)180U0X0E0)0V050k1517191b130n041z1G051J0k1J1L1G130!0$0t0?0^0`0|0r0$0z0r0J1Z0r0(11050.0D0J0)1U0_0{011Y1!1$1!0(1,1.1*0(0D0T0!1b1+0U1H0(0r0?1e0V0n0N0i0|0w011:1W010B0:0)0i1m0)1*2b2d2i1=2l1.2o0Y2q040a0%0O0U0T0n0T0V0$1h1j0,290U0U0)0v2L1z2s0i1H0k272X0(2524260!2u0|1$0i2n2I1*1R1T0@1;2+0$2-0i211S1*0n2Q1H2V2X32142c1j2?2j2{0U180J110%0W2U3612352t381=3a3c3e0w3h2d3j2V2*013o0N3d040%0d3s2W133v3m0|3y3A0%0f3E3u363w3K3e0x3O3G3Q3I3x0T3b3z3e0y3V3k371V3n3!3p3B0u3)3H3,3J3.3$3B0m3=3X3@3Z3#3L0A3}3l3 3S040W0q443+2@403/0W3g1A3i1I301z2;2!0!2(3w0v212A0+1S1H2 0)314j4i3t054s0,4A454d0P110,0B3O3*3w0L3e4O3?4d0i0B110J0n0;0V0v4T3~4d10040K4(4I39110(0)0j4=0I0N4.4c2j4+0H3O0%4P3Y0i4;4?4^0D4{3w4+0o0S3V0%5f514U4:040J1i0z1w0E0U1y4C2W5h4)2j0T110C50523 4+0c593Y0Y0$114a5s3B5B4J110B3!5A5i3n110I5S5v1=0T4R042_5X4/3n0D110U2d0z0)5F5C114-5L5N395+5k2n5;4*5?5~5j4=4@0)4_611=5b5(4|5Z110*6a3w5H114h345T0|5b0#5e5g5_1=4K045Q0U6f534;0/0J1.0I585L5u5)0|5!115%6F6r3J5{5-0i5/676m605^6l016h486T014~6x465{2x6#4+5@6k5Y3J55646D6,110o6(4d5x046e6M6X6Z6j4j6X5b5d5L065g7a6G6b6;044=1n6{5w5y7i68115E6W6:6Y5I045K327c3w6t6v7l7e5W707q6J5$0i7A3x6P5.5:7p6H6$6V6/7O0i6*5}7N7d7P4,6#547f56654`7W5a6_7I6}6 7v6N7r6i6^040o6o787b6q6X7y5R7D7S6z0:6C7)7:6X7F6L877q7T5,7L7@6.747q727@4 817X8d5|7H7*3Y6-7!6=4^868i7O698n3w7.7I8k8s5=7^7732797|7b7;6t0$4N8C6y7$6?8y4D757n8v7f6A857-110G8F7s738Y7q4+7`8b7O6}0C5z8T468w656E7R7X5D8#0.848~8)048+8{4d8G907+040#8K3i8M8N8N7;7#7g0n7@7o9d8U946B7(7@8=3i7w3Y8^8,7?9a7j6~7I7#5l6R5o5q9q938%9w9F6c989D6!8H5 9f6p9k5f8P110)0;7M9s8I9h3t9j9#7a9m557h9X4}8!9_5U8$95669|6U9Z9S6I7ka47J11180j8g931s9pa17Y9r8z8o839va08?7X6}99ao6g8-9x8mas8U9K5n0)5p5r9,9Yai8/829~am8X2W7;8;6`7{9l6X9J5m9MaD9z7;9Ca79nae9!9A3 6t2Q0(5p8rax8|5kaUaB9Nag92ag8p6+a^7Qaj3R8}ana 8t6_9y9/1z4F4z4kba0k4n1z0(4pbf2$2Y20222!0N1-bc4n1F4H7X2Q0Y0I0B0N0P650r0d111r1t1v1x0%9.aM1M3j1G0s0-4=0%5Q0i2S0$1i0%1x0(0%2K0Q5-0~0t1/0-290i0V2#0E2K1/0N1g0T5p0%0!000E2-0%200E0@1/4E4t3w1@1#1%1)bt7x5P80340kb9040g1IbN040p1/1|0)b@0%b/0T0v0P2db!1.0=azaVb{bI1R0B0Bb%2n4=0=0Vb_0V0G15b=0=4s17b~cF0)0t5-2K0%0N0t0T0$0U51b9c71%1_1(2r8jaua78Ea!7Ua.b38I8haHak8V8x7@aPcgci299K2-0=b,c52N3Yc8c:cb7;9caX886d9Ic{aca`b18 c}9Yd54Bd71_da0g060M371ib/0NbR0i0Q2d0Yc)b.0%bH0%cAbS3.0EdS2N0U0Q0v5p2QbU1/b bTb!0N0n0n9)0=1v000bcE0=0t3za?0=0$0`1w0=2N0^0%0Y0h2zdR1Zb b_cEdR0N0%2 dZ0Q0,0i4=ckbMbsdDeeaBb!0!1i0vct1/4sejcK0)c+b|1g0:d}eAcE0E0j0%cqb@eJ2Nddew3 dgcac=7Odk4Dch4t3Bdz0)el1P1Kcned4y5H0e2Qe70zb 0!0EeKbo1.csb,e2e,0$e.ew1e1ib b ex0~2n2`b!dQ0,0=ePc.1^eTcc5G7s7udxeZe%cm0Ob_c+cU4!0Q4=c+dSb@2#bI0v0_1x0H0%bXeD1$0V1/dS6v0YdVcX0%dYd!2P2n0ve$cl13bd0-6A0V04.

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

.128013à[3è4.ênx/R8p)L0hCv7c256g9f=buS-,_l(wOaPké;:ors1qmyd]i te+050!0)0(0N0$0J0V0%0v0J0N0V0V0C010(0$0n010406050V0E0Y0Y0N0U0Z040F0T0J0E0~0T0i0%020N0Y0n0R0%0l0)180U0X0E0)0V050k1517191b130n041z1G051J0k1J1L1G130!0$0t0?0^0`0|0r0$0z0r0J1Z0r0(11050.0D0J0)1U0_0{011Y1!1$1!0(1,1.1*0(0D0T0!1b1+0U1H0(0r0?1e0V0n0N0i0|0w011:1W010B0:0)0i1m0)1*2b2d2i1=2l1.2o0Y2q040a0%0O0U0T0n0T0V0$1h1j0,290U0U0)0v2L1z2s0i1H0k272X0(2524260!2u0|1$0i2n2I1*1R1T0@1;2+0$2-0i211S1*0n2Q1H2V2X32142c1j2?2j2{0U180J110%0W2U3612352t381=3a3c3e0w3h2d3j2V2*013o0N3d040%0d3s2W133v3m0|3y3A0%0f3E3u363w3K3e0x3O3G3Q3I3x0T3b3z3e0y3V3k371V3n3!3p3B0u3)3H3,3J3.3$3B0m3=3X3@3Z3#3L0A3}3l3 3S040W0q443+2@403/0W3g1A3i1I301z2;2!0!2(3w0v212A0+1S1H2 0)314j4i3t054s0,4A454d0P110,0B3O3*3w0L3e4O3?4d0i0B110J0n0;0V0v4T3~4d10040K4(4I39110(0)0j4=0I0N4.4c2j4+0H3O0%4P3Y0i4;4?4^0D4{3w4+0o0S3V0%5f514U4:040J1i0z1w0E0U1y4C2W5h4)2j0T110C50523 4+0c593Y0Y0$114a5s3B5B4J110B3!5A5i3n110I5S5v1=0T4R042_5X4/3n0D110U2d0z0)5F5C114-5L5N395+5k2n5;4*5?5~5j4=4@0)4_611=5b5(4|5Z110*6a3w5H114h345T0|5b0#5e5g5_1=4K045Q0U6f534;0/0J1.0I585L5u5)0|5!115%6F6r3J5{5-0i5/676m605^6l016h486T014~6x465{2x6#4+5@6k5Y3J55646D6,110o6(4d5x046e6M6X6Z6j4j6X5b5d5L065g7a6G6b6;044=1n6{5w5y7i68115E6W6:6Y5I045K327c3w6t6v7l7e5W707q6J5$0i7A3x6P5.5:7p6H6$6V6/7O0i6*5}7N7d7P4,6#547f56654`7W5a6_7I6}6 7v6N7r6i6^040o6o787b6q6X7y5R7D7S6z0:6C7)7:6X7F6L877q7T5,7L7@6.747q727@4 817X8d5|7H7*3Y6-7!6=4^868i7O698n3w7.7I8k8s5=7^7732797|7b7;6t0$4N8C6y7$6?8y4D757n8v7f6A857-110G8F7s738Y7q4+7`8b7O6}0C5z8T468w656E7R7X5D8#0.848~8)048+8{4d8G907+040#8K3i8M8N8N7;7#7g0n7@7o9d8U946B7(7@8=3i7w3Y8^8,7?9a7j6~7I7#5l6R5o5q9q938%9w9F6c989D6!8H5 9f6p9k5f8P110)0;7M9s8I9h3t9j9#7a9m557h9X4}8!9_5U8$95669|6U9Z9S6I7ka47J11180j8g931s9pa17Y9r8z8o839va08?7X6}99ao6g8-9x8mas8U9K5n0)5p5r9,9Yai8/829~am8X2W7;8;6`7{9l6X9J5m9MaD9z7;9Ca79nae9!9A3 6t2Q0(5p8rax8|5kaUaB9Nag92ag8p6+a^7Qaj3R8}ana 8t6_9y9/1z4F4z4kba0k4n1z0(4pbf2$2Y20222!0N1-bc4n1F4H7X2Q0Y0I0B0N0P650r0d111r1t1v1x0%9.aM1M3j1G0s0-4=0%5Q0i2S0$1i0%1x0(0%2K0Q5-0~0t1/0-290i0V2#0E2K1/0N1g0T5p0%0!000E2-0%200E0@1/4E4t3w1@1#1%1)bt7x5P80340kb9040g1IbN040p1/1|0)b@0%b/0T0v0P2db!1.0=azaVb{bI1R0B0Bb%2n4=0=0Vb_0V0G15b=0=4s17b~cF0)0t5-2K0%0N0t0T0$0U51b9c71%1_1(2r8jaua78Ea!7Ua.b38I8haHak8V8x7@aPcgci299K2-0=b,c52N3Yc8c:cb7;9caX886d9Ic{aca`b18 c}9Yd54Bd71_da0g060M371ib/0NbR0i0Q2d0Yc)b.0%bH0%cAbS3.0EdS2N0U0Q0v5p2QbU1/b bTb!0N0n0n9)0=1v000bcE0=0t3za?0=0$0`1w0=2N0^0%0Y0h2zdR1Zb b_cEdR0N0%2 dZ0Q0,0i4=ckbMbsdDeeaBb!0!1i0vct1/4sejcK0)c+b|1g0:d}eAcE0E0j0%cqb@eJ2Nddew3 dgcac=7Odk4Dch4t3Bdz0)el1P1Kcned4y5H0e2Qe70zb 0!0EeKbo1.csb,e2e,0$e.ew1e1ib b ex0~2n2`b!dQ0,0=ePc.1^eTcc5G7s7udxeZe%cm0Ob_c+cU4!0Q4=c+dSb@2#bI0v0_1x0H0%bXeD1$0V1/dS6v0YdVcX0%dYd!2P2n0ve$cl13bd0-6A0V04.