Aller au contenu

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 :
            • on renvoie True

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.
###(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 : /
.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.

###(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 : /
.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.