Anagrammes

Deux chaines de caractères de même longueur sont des anagrammes 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.

Déterminer si deux chaines de caractères sont des anagrammes peut se faire en les comparant après les avoir triées.

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 teste si hien et nihe sont des anagrammes
  • on observe que h est bien dans nihe
  • on teste si ien et nie sont des anagrammes
  • etc
  • on observe que n et n sont égales : on renvoie True

Vous devez écrire deux fonctions :

  • supprime_premier(chaine, cible) renvoie un couple (present, chaine_sans_cible) dans lequel :
    • present est un booléen indiquant si le caractère cible est présent dans chaine,
    • chaine_sans_cible la même chaine si cible n'est pas présent, la chaine privée de la première occurrence de cible si elle est présente
  • anagramme(chaine1, chaine2) renvoie True si les deux chaines sont des anagrammes, False sinon

On garantit que les deux chaines sont non vides.

Exemples
>>> supprime_premier('ukulélé', 'u')
(True, 'kulélé')
>>> supprime_premier('ukulélé', 'é')
(True, 'ukullé')
>>> supprime_premier('ukulélé', 'a')
(False, 'ukulélé')
>>> anagrammes('chien', 'niche')
True
>>> anagrammes('énergie noire', 'reine ignorée')
True
>>> anagrammes('louve', 'poule')
False
###(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:Lp(40ed3; 1jo5_n)h]6,qc[yFuvà8i2+xms7=wlSatf-9ORrg.TéPkbè/050i0h0S0R0G0P0L0l0y0P0R0L0L0N010S0G0d010406050L0C0K0K0R0Y0A040Q0o0P0C0 0o0r0l020R0K0d0k0l0X0h190Y0x0C0h0L050+16181a1c140d041A1H051K0+1K1M1H140i0G0D0@0_0{0}0t0G0Z0t0P1!0t0S12050/0)0P0h1V0`0|011Z1#1%1#0S1-1/1+0S0)0o0i1c1,0Y1I0S0t0@1f0L0d0R0r0}0H011;1X010T0;0h0r1n0h1+2c2e2j1?2m1/2p0K2r040a0l0%0Y0o0d0o0L0G1i1k0-2a0Y0Y0h0y2M1A2t0r1I0+282Y0S2625270i2v0}1%0r2o2J1+1S1U0^1=2,0G2.0r221T1+0d2R1I2W2Y33152d1k2@2k2|0Y190P120l0m2V3713362u391?3b3d3f0H3i2e3k2W2+013p0R3e040l0j3t2X143w3n0}3z3B0l0f3F3v373x3L3f0p3P3H3R3J3y0o3c3A3f0v3W3l381W3o3#3q3C0M3*3I3-3K3/3%3C0F3?3Y3^3!3$3M0V3~3m403T040m0g453,2^413:0m3h1B3j3X464e480m3s4j3u4l4d3a3`3B0m3E4r3G3+3S4w120m3O4A3Q4m4v424F3V4I4t4D4M493)4P4C3Z4o3=4V3@4n4E493}4!3 4$4S0m444*4K3.4S0H4b4:4u4=3:0H4i334Q4X4%0H4q351N311A2=2#0i2)3x0y222B0,1T1I300h323j3P055e0-5m4;0}0(120-0T5o4#2k0O3f5z4+3a0T12160d300G2A0q5k0K0G0h0Y5E5t0111040e5U4`3K120y0t0:2.5!3x5X0b3P0l4W470)5I2$5,3Z5X0w5:5=4n5%0G1.0h5`405.5~5A3o5@040L5_4I5 2k5X0s685F1?0o120U020Z0S0k6k5V0r6b6d5T6f690}674P0l6F5;6B3y122R160P0/0S6u5#016n040N6Q3x0L2h0401013W6G6H6l5$040-0n0R0q0D0C6W3Z6T6V4I6)5V0(0y120B3A0L646E6G6g1?5v040T3#6?475%1a0R2T5S73336{6R0o5C042`7c60045(5*7j5n6I6D4 6(6(765u120G5y6`7D6J7t7f7h2R7r2k6^6_7k7J0r61637P6m7o2e0i7Y0}7n122|6P7I6I7V6,0h6.6:6=6A6*5W125/747B7B7U5w7;6/6;7%6S127S3j7l3x6}120#0Y1x6%7~8a3Z780h0=7w3u7J7z4k8i7 7.6K1y0C6N0R7,7T6I6T0I883u8j7d7L0Y7g0S7i8h6F7J782R0S0C0Y0r857/6-837@357y125}7-7_7/6L8y6O3W065040785x654e7o5;7^6v5H042e0R0Z8L181y8`6h125Z8~6R7/7u2`0h4~7x7_8r8H7U6x6e8%9k8)8Y5%5)9g549j5V9l2X8I4n9o6z9q9z126j8+5V6T6p6r6t9K9d6b211f981?9A137C6I787G8Y6b2y9V6C9a9*7K9f2.9i8p8(049J8C7_7R855Q4F9-9X068t8R8w8U8W9t7t9v9:859{9Q3S9u7v9x4s9Z7_8l8n9 7{8P8u8,7W1/ab87a79/9han040z9-9}044^9G6R5X0uapaj6v120D8L0Gaz8*9_aMa87v0m0q0L2e0L0q0y62atad6@ava*8J5J5L5N5P5R9F9yaH9,9caeaV9g9;2X8q9sa-7sa%7Xa{5{9IaK758v7ta(0h0q0ia!0qahb09?aS8980a}2.0HaYbib5a)aT7ma,bxa|a/0Y5Mbfa=5Saz9baGa|axbk5sa_04bn9mbcbv8obl9r9@ba8Q9!7F7HbA4Xasbfbh0ra#bNb1047|7A8tbbaka48V8Xb33a1292941n2A1zb766a`bKb)bq9hbtb-a$beaRawa90hbsaZcdbUaz9^8s8ia3048m72azb=cqb@9C2k8S0.b{858c0470am4V0+5q5l1J570+591A0S5bcS2%2Z21232#0R632Y591GbO3x2R0K0q0T0R0(bf0t0j121s1u1w1y0lcx8p1N3k1H0c0R0l7a0r2T0G1j5;cM6c0C5KbDa;c,a?1Adc0l0r0$0y1y2K8N0l2O1S6d2`0Z1x0Y0l0d1g2K0h8V0?0y0`dt1:2mdy2Rc}1J3k8y3k1%041/0@7M0S0*dO1g0l1y0Sdt7G0T0$2R0rd)0i0CdX8L2Td!1:5(5S5(0$c}0ldadW2R5e0d5R1AdU14dUdWdId@dZd#d=d(0l0$0Z3A0l0Rd=ec8Md_0@0td|0td~0.0l0;dm00d42d0?2o5edO0$0Sd~2$0o0C0Dd~5Zdc5k72d/dk5f3C0SeM0neM0Y0?0Edb5f3x1^1$1(1*c*8k6~cH71bV2Ydc0sd da2.0le22S2H5RdB0`0w0l190G0?da2`1Sc{0l1w00e1eB0leLeNewd)bC5MeP5pe*3Ze,1`1)2sar04eS2o8Bbo8DbzfEake=8e8g6fcLeW9Je805ead`dYerd$ehejelend?eqdOd{0Yd}d%d)ezd40i0$0ne(eIeK2Gfm1Bdea:d~0be01kf0e4e60+fQdUdad.0D0of32I8Vd52`0GdAebeMdC1:fs5r0efBd/f68.8z0S9Jdce70G3k0+dSc)0%e#e d4d6d8dagm5lc095c3eV5rdPd014gBfRgy2Ke c|0-0C0Jes7v0?0L1jd:1:0P1jdydFdA0mf6g72og9f3e20$6M6OdKgYgd5e1o7ff9da0edI0?2O0)0`1:2O0_0l0YdodG1T2L0$fPgye9gW2`1jg@1kfp2AgYdBdi5Sf#d^dO2OgKca4idlb,0?1/hadFg$axc4g5gy7u0y0C2Nc|0R5Kcue)5rhwbFhA0Yh8cif6bUgveWhhg_gag-d4axhh0$d;2L0hf6f80?en0{0G0lhW0l9T0P0$2oey0rfd0C2efoi5hghGcnfNgQeI0:d)30g}fChea!gFg%9ggxdTgyda72dK19ie1:3A3#g)i5ilcfin5lei0/2Ldtiwilci4qdl0edWbGdAephDhegldcaxhIh;ehdndp0{0:c,fCiUb-h$5li-gP5l0s0!0l0W1k8N6d0h060i1j0yhyi9ib1kg80o0Ad~2ddAhGh(5Oh*h,agh.beh:gQ5/gUdUgX0y00ehebf5f emh!0PdWhggH2M0l16i%c|hQ0l01hih}j66$g4hpgV6ci5dpeAeheDhyh9huh=0rg`i+ft40fve.fy6|e=cIcvfMhJgg2S8N2AeUjZgzgUk614gA0Pgz0-iS0=04.