Anagrammes 💥
Un exercice initialement créé par Nicolas Revéret, puis modifié.
Définition
Deux chaines de caractères sont des anagrammes si elles sont de même longueur et s'il est possible d'écrire l'une en utilisant tous les caractères de l'autre, quitte à les déplacer.
Par exemple :
- les chaines
chien et niche sont des anagrammes,
- alors que
louve et poule ne le sont pas.
Méthode récursive
Déterminer si deux chaines de caractères sont des anagrammes peut se faire en les comparant après les avoir triées. Mais on utilise ici une autre approche, récursive :
- si les deux chaines sont de longueur 1, on renvoie
True ou False selon qu'elles sont égales ou non
- sinon, on teste si le premier caractère de la première se trouve aussi dans la seconde :
- si oui, on recommence le test sur les deux chaines dans lesquelles on a retiré la première apparition du caractère testé
- si non, on renvoie
False
Exemple
Pour tester si "chien" et "niche" sont des anagrammes :
- on observe que
'c' est bien dans "niche"
- on enlève les
'c'
- on teste si
"hien" et "nihe" sont des anagrammes
- on observe que
'h' est bien dans "nihe"
- on enlève les
'h'
- on teste si
"ien" et "nie" sont des anagrammes
- on teste si
"en" et "ne" sont des anagrammes
- on teste si
"n" et "n" sont des anagrammes
- de longueur 1, on observe que
"n" et "n" sont égales :
Exercice 1
Coder une fonction supprime_premier qui prend en paramètres chaine (une chaine de caractères) et cible un seul caractère et qui renvoie :
None si la cible n'était pas dans la chaine
- sinon, la chaine sans la première occurrence de la cible.
.128013,59/fT78r;nb N_o=ylaepcwgu)vd46F13kRméhtsP(S0à+2èj-i:050D0v0O0u0!0t0P0n0x0t0u0P0P0r010O0!0w010406050P0A0L0L0u0j0s040S0q0t0A0_0q0l050e101214160~0w04051m1f1p0e1m0~0D0!0C0.0:0=0@0N0!0z0N0t1D0N0O0|050)0m0t0v1y0;0?011C1E1G1E0O1M1O1K0O0j1n0O0N1Q1A010f0+0v0l0u0L0v010.190P0w0u0l0@0W1K1{1}1+1S1.1O1;1?0|0a0n0Q0j0q0w0q0P0!1c0l0n0%1_0j0j0v0x2k1f220l1n0e1)2x1$1(1%1L0D240@1G0l1:2h1K1v1x0/1R2H0!2J0l0q2N1K0w2q1n2v2x2#0 1|2l2P1,2U0j130t0|0n0H2u2)0}2(232+1S2-2/2;0W2@1}2_2v2G012~0u2:040n0I322w0~352|0@383a0n0E3e342)363k2;0c3o3g3q3i370q2.392;0F3v2`2*1z2}3A2 3b0h3F3h3I3j3K3C3b0i3O3x3Q3z3B3l0d3W2{3Y3s040H0T3%3H2Q3Z3L0H2?1g2^3w3(3:3*0H313^333`3/2,3S3a0H3d403f3G3r450|0H3n493p3{443!4e3u4h424c4l3+3E4h1q2Z1f2N2A0D1(2F3y0x2V1@1n4y1o4w2%4u4E0%2!3X3:0J0|0%0f3o4b3y0y2;4W3P3|0f0|100w2Y0!1?0p2Y0v0L0!0v0j4#4Q1,0{040R4_4j2}0|0x0N0*2J4 431S4|0#3o0n4X3)0m4)1$57364|0b5c5e3|520!1N0v5j3y5a5n4$2,5g040P5i4u5y590|0B5x4`1S0q0|0Z020z0O0k5J503j5A5C4^5E5K0@5w4o5o1,4Z3b0n5,5u3Y0P0D0|015?3.365:2;5,0n0K1:0C0q4?0n0:0.542S1P0P1}0-644:4=0X2q0n0q0x0x0A2p1:0x1P2n640x5r1O0n0R0A2l0P0v0A0t0.140u2s6f0v5I5%5F0@5`5+5,0S0!630u0.6t1P0v5C0n0u0m6z0l0O0v0b6S0n0f1d2s0!1d0n2q0l60620o1d5t6K5!016N5|0n5?013v715(51040j0M100t0)0O5T580@5M040r7g5_20045@4o766L374T0M0Y0U0p0C0A7m3y7j7l4h5d7t0J0x0|0G396z755|770@4S046-5Y2#7H6~0l526E6G2q7C3Y0q5*2S7)5p0453556|2%7t5$2#06717s6~7T0!4V7G7R7u7:7$0O6H7.1,7E7F7X837!7:6V895L5*1}0D8i7i5*2U7f827t8f0D7w7y7A5.3:7_3_7|8D7Y5U848v7x7z7B8s6~7E8n017J0|0g0j0A7?8C8E837T0v0,8W33838B418E7|8e0|7a7c7e8P7j0V8c2^8F7h840x86887r7Q7I0|808P8u8w8K8z4{0|5b918D8Z8/0(6l1e8M8G8f8:6B8=9e8{368!8$9a5G049d7`8,9g799i0j9k8d7I7K046`565%0e4N0v2x4:2x4I2y4A1f2B9X6!1O9T1w2_0e0%0)0+0P04.
exercice 2
Coder une fonction anagramme récursive qui prend en paramètres chaine_1 et chaine_2 et qui renvoie un booléen : True si les deux chaines sont des anagrammes, False sinon.
On pourra utiliser la fonction supprime_premier, même si l'exercice 1 n'a pas été résolu.
.128013],59/f!78r;nb N_o=ylaeêpcwgu)vd46F13kmhtsP(S02[-i:050F0w0O0v0X0u0P0o0z0u0v0P0P0s010O0X0y010406050P0C0M0M0v0k0t040S0r0u0C0?0r0m050f0}0 11130{0y04051j1c1m0f1j0{0F0X0E0+0-0/0;0N0X0B0N0u1A0N0O0_050$0n0u0w1v0.0:011z1B1D1B0O1J1L1H0O0k1k0O0N1N1x010g0(0w0m0v0M0w010+160P0y0v0m0;0U1H1^1`1(1P1+1L1.1:0_0a0o0Q0k0r0y0r0P0X190m0o0!1?0k0k0w0z2h1c1 0m1k0f1$2u1Z1#1!1I0F210;1D0m1-2e1H1s1u0,1O2E0X2G0m0r2K1H0y2n1k2s2u2Y0|1_2i2M1)2R0k100u0_0o0J2r2$0`2#202(1P2*2,2.0U2;1`2?2s2D012{0v2-040o0K2 2t0{322_0;35370o0G3b312$333h2.0d3l3d3n3f340r2+362.0H3s2@2%1w2`3x2|380i3C3e3F3g3H3z380j3L3u3N3w3y3i0e3T2^3V3p040J0T3!3E2N3W3I0J2:1d2=1n2W1c2K2x0F1#2C3v0z2S1;1k3`1l3^2!3=3005400!2X3U3-0L0_0!0g3l3D330A2.4k3M3-0m0g0_1`0v0B0k1/1:0P4p4e1)0^040R4C3#4r0_0z0N0%2G0q3;2!4q4E0_0Y3l0o4l3v0m0n0_0P1Z4I3,4U040c4X4Z3$4L4N2P0w0q2~482t4:3-4F4W4{384}2)4$044(0k4*334F0D4/4T1P0r0_0W020B0O0l5d4D2`550n0r16593v4 3s0o5y4Y5e0;4g040X4j515A5o3g55245u3V4F4H51532`4=4O4^4R3?5B015b5n4J1)5g04020u5l0s5$4+1P0M0X0_5X495Z5w51065z5~5I5%1P5D2n0O0C0k1b5H5S3g5U4@4Q5/335)0s5.695Z0m6c4P4`2Y5}5z6a015D0w0)0w5N4~4V5x5 5y6t6m040z0X1K6y6k5J016h6f4!6n5W6z4,0V6U5;5?043*5R5`0_0b6C6D6F6S6e6M610;6P6/5:6b560C0y2V0X1:0q2V0w5=0w586$6N5P6X6^4M5V6.4S760_4.6?3o4L6J1L785!0_5c5H606@010z0J0_030o0m000w4(0o1_0*0p1a1M0h6*5 6,6H4?6o6Q3V6=2Y7r7i6_6{0k6}4^7072747d6:7n4G7m6G7a6d6p5Y7e4-7Q4K6H7k6L7(7s5#7q6t7u7w7D0w180W0x1Z1M7G2G0o0h8d7K5~6t5D5F7@2)6-7:307U3v0r4n5E4B7h3v0L0z0_8a7{7;7)5{6q6D6+5Z630#66687T8h8y040I360P8B306r8H6N6v6x7m8E2=8W8G6E8I0_648L8k5T044v4x4z7B8#0_5Q7|7V7.4P5^4|6%7?8v4;7N7b8n917=7p6q1c4b0w2u702u442v3|1c2y9m0v6K9i1t2?0f0!0$0(0P04.
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)