Aller au contenu

Rang d'un anagramme⚓︎

On considère dans cet exercice des « mots » comptant au moins une lettre. Ces « mots » n'existent pas nécessairement dans le dictionnaire.

On n'utilise que des lettres en casse majuscule et non accentuées.

Les anagrammes d'un mot sont tous les mots que l'on peut écrire en utilisant les mêmes lettres. Là encore, les anagrammes ne sont pas nécessairement dans le dictionnaire.

Voici par exemple les premiers anagrammes de "GALA" :

Anagramme Rang
"AAGL" 1
"AALG" 2
"ALAG" 3
"ALGA" 4
"AGAL" 5
"AGLA" 6
"GAAL" 7
"GALA" 8
... ...

Répétitions

Dans le cas où le mot compte plusieurs fois la même lettre on n'écrit qu'une seule fois les anagrammes correspondants. Par exemple, "ABA" ne compte que 3 anagrammes : "AAB", "ABA" et "BAA".

On peut associer à chaque anagramme son rang dans la liste triée dans l'ordre alphabétique de tous les anagrammes du mot. Ainsi, le rang de "GALA" est 8.

On demande d'écrire une fonction rang qui prend en argument une chaîne de caractères mot et renvoie son rang.

Attention

Il est possible de déterminer le rang d'un mot en énumérant tous les anagrammes dans l'ordre alphabétique mais cette version devient rapidement très longue à exécuter.

Par exemple, le rang de "ENUMERATION" est 1 971 860 !

Exemples
>>> rang("GALA")
8
>>> rang("BCA")
4
>>> rang("ENUMERATION")
1971860
###(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:LpM(40îed3;N 1Ej}o5_Aên)Bh]6,qcG[y!Cuvà8i2+xmsU7=wlSIatf-9O{Rrg.*TçéPkbè/050k0j0(0%0Q0!0V0o0G0!0%0V0V0Y010(0Q0d010406050V0M0U0U0%0/0J040#0t0!0M1e0t0y0o020%0U0d0m0o0.0j1o0/0F0M0j0V050}1l1n1p1r1j0d041P1W051Z0}1Z1#1W1j0k0Q0N16181a1c0B0Q0:0B0!1?0B0(1h05110{0!0j1.191b011=1@1_1@0(1 211}0(0{0t0k1r1~0/1X0(0B161u0V0d0%0y1c0R01231:010)130j0y1C0j1}2r2t2y252B212E0U2G040a0o0_0/0t0d0t0V0Q1x1z0 2p0/0/0j0G2#1P2I0y1X0}2n2;0(2l2k2m0k2K1c1_0y2D2Y1}1+1-17242~0Q300y2h1,1}0d2*1X2/2;3i1k2s1z362z3b0/1o0!1h0o0p2.3m1i3l2J3o253q3s3u0R3x2t3z2/2}013E0%3t040o0l3I2:1j3L3C1c3O3Q0o0g3U3K3m3M3!3u0u3(3W3*3Y3N0t3r3P3u0D3/3A3n1/3D3@3F3R0X3|3X3 3Z413_3R0P453;473?3^3#0+4d3B4f3,040p0h4k3~374g420p3w1Q3y3:4l4t4n0p3H4y3J4A4s3p493Q0p3T4G3V3}3+4L1h0p3%4P3)4B4K4h4U3.4X4I4S4#4o3{4(4R3=4D444.464C4T4o4c4?4e4^4+0p4j4|4Z404+0R4q524J54420R4x3i4)4:4_0R4F5e4/4m5h4O5k4@4!5b4W5p4}5r4a0R4%5u5348554-5A595C5b4=5F4*5b4{5K5g55515O5m4+0l575S4~420l5d4z5l5Y4a0l5j5$5q5a5)5o5,5v5.3Q0l5t5;5B4u5)5z5`5G5|5@5E5 5L5)5J645P5Z5N685T5Z5R6c5(3Q0g5W6g5w6i5#4H5%6m1h0g5+6p5-5H4a0g5:6v5=6x6i5_6B5{4n0g5~6G606I636L656i676P696y6b6T6d6y6f6X6h1h0u6k6#6r040u6o2:1Y3g1P342@0k2{3M0G2h2Q0~1,1X3f0j3h3y3(056{0 735{0`1h0 0)756w010Z3u7f6C3N0)1h0t0G0G0M2)2D0G1N7k5{1g040f7x6M1h0U0t0(7C3M7z0z0b3/0o7O0o6q3D7c2+0t1D0(7w4X7Q7g0t1h0Y3(7!7l7z0-0s7N7P7R1c7b040)3@7)7;3N1h212b2*7`7#7i0439817l0y7E7G7I3=7z7M4(7P8g7*7a1h0Q7e7Z7{88047~2^0j865{0t83858n7g8p0 6{7W7Y3k7g8d7/8h8h8o7T8D0d7X1O4X7{7z0I8b4m7}108s8W4t7z0C8u607$040S7(8z7l0U0Q4U8J8L7g7?0j148t8S8H1h8e5e8K8K8M048C7V8P8F748 048V8~878Y7 8}8G7+1h8(8/8v7%8)3M8;8?8f7:8_1h2*0(7s0y9r4:8N988Q3/065f4f7?7d8#2z837Q9f6H7n7@0%2,3@0Q8{219O257z7B9S7D049C9*7J1h7L8@7{7?8l9D8X9,9_4t8+0Y8.3i8i609t046)6/9c914z93a23M7?9z9B9|2za46.1i8g9?9y10ag9o9+9-a17{8+0=ah7S9V9X0/9Z0!9#9.8c1h9)9k6H1hat3yac3=8+0*ay1caj9$1c7K9I9K4t9M0j8maK609QaW7m7E0M0!1e3b8;3Pa,9(a,8paN3J8T1h0EaT7|042*0d102!0Q1y8Ra)9/049;9v7O956{a%a(aOav9qar3+1h0)9W0(9Y9!9j9b9l7Aa`aMa^9:9=9x7@7_bo9E040Tb18w8ka|2:aP9`b4b62#babx7y908@am8A1hbi0)bk3JbR9}1h0}0}a0blb$aAbtaCbvbCbzaG9`bLb}8$bDbfb,2zaeap0/bP3Rbh0tbjaZan96a%a,a+c03p9U0/2t0:b{aJbX9+7F7Hck9%9:a94Hb#7l9@b*bQ8o0{8Yc9a~b|bbbJcub{0zbM7%b;b+7{aVcwaXbZc3cB8jb3c7c9c425cW5e06c#9+0!1y0:1M7scR04cTcF8AcH8q2DcqbA04cOcX01aYc395978EbWcU7#bnaub?7p7r7t0y7vdca7bycra}b?d4cM4fd7929w9g04710V2D9HbI4f9~b18Ud28r80dFa#bqbHdgdzdLbwdd7lbN84c)d97Udbb{9ndxbgb?dT0V0v2^9Z9adV9pc`b10yc~0V3@7X0kd1d58pdBdDd;dobYbdbEdzbt110!c_c{ca7ga4a6aldyaL84edb1ehe8c$0Z1=aFdReld,d.b_e47960dJe08kd%c_0Keec*3Z89cvduc19da,epd58%cz3Vabd!0{1wendN3p9h8sd-d/0jeAcK9eeOe%emeT9mb!ek9+bT1ebVe#eveC1h0Id(aa93cf7^0/d^e(dMe 3MdX8yfcbJe20ydEe:cx04eVejabd*cC8kcEefdS8Zfbb=dW1heIf9cgeZeNcsbcfoc.fq94b?e{b7b9a,8+0;d20%0db50yd~e?cLfHbJda99dneBbce/f$9`dTd%cQc!f5bF8{dCb{fJfLfMdzfOe}d5fSfUfW2DfZflcYf#drdzf(fkf.ePf-gbewfxdUe5f004f3d=8*1haSe$c+8=4ocPe^freleaa@gu1c8+8-fD0Ua/a;7V0QgDg8d6aIdKc=c@f8gE01aReogwakcKb0gW8pg0b80yf*cKf=d)8^dz0Qc_gHgWc,f4gA60c69Ac8fDgCecgWgGfDcn0ycpf!dqgmbpd38af!ghhc3=g`gign0b0Cg/4z9J7{0G0p1h030o0?1N0(f*a!c51h240j0/fGgqhdh7h9gPa_d50V2w04010H0w0c0w01gyh4cSgZ1h6Whidva b1hQ1h010q7t7s0o1l0/0o210ohL0o2%hUhWhY58adhE1ahGhIc|f cod gPh-hS0A0LhXhZfgdGh#g_gw6Fh)ePg%ij4tidh/h;h^h@h_22h|2%ifihi23=7?hFhHh6iahaa,iu0w0A0w0wig0Li1hNc2is2z9~eJcVgw5*b{irfz5{iuh:2*h=iyh`iB22iPiRiTiV6l25iHi5iJg(9yiLiWgaip2zi-0n0W0e0q0.0w0?0$0,0ni{hlbchphJaQiliYgv4U0+0X0p0P0Deig$h,hRivi/ixh=i=coh}220qj9jbjdjfjhjj4Q0}77726:jU0}6?1P0(6^jZ2_2=2g2i2@0%20jW6?1Vf+3=2*0U0vbr0`0j0v0B0l1h1H1J1L1N0ofo1Y3z1W0,1z3@0:2t0QdCiz2p2%2D0o0d1v2Z0j7s157^dlbVk4k61ja/3z1_k71XjT04di7s2*dl7YkC2p8Ekga=0{2*h}00kEdkdmjI160B0%k2iz9ih}2t15766|hecvkC0;0ok9kkko0(0o1w13kehGkg0/0^1la:0%k?0%2B2$221_0V7Xh^2115d,kkk}dCfjk30kk%7QkCd4kJ0b1622d{fjiz1517k~h}0Mh}0Q2,g+2E0Q2*fT1$3z0}kz1jlL1!kBk*braBaDaFkJkG0N0t9Zh_0%0olRb^lT220k000M1zdD9Zh^2X2Z1e0)llk*9-k-k/1zk^l7l6220G19kV0{1922k)781z9 0o57kJ2Xi:0Q1D1_2Bk{h`m30!7r0!k$g,l!l$1ylC1yl_78gJa:39gMgDk-kv1PlNlN1ZlmgKmDa?h3kJmomqm10okNkP2%b53r1wl1g+15l+l-0o2DdC0Uj-kVm972l{k*0o0^0!0^2Pfj0V0Em+1z7X2Elt8O7XjI15k}0d0^e|m%mv9B9Zm(lkm;c%b5ncfQjSk*k.mH1W0#0Qk@30n70o0N3Pko0/m(m8kCg*1y1PkJnz1wmzm24f271^1`1|j;4feS3kno78m 182p0y0Nl/my0heI0pk;3r10kVbtnL2%0U0x2P163PmTlaiAk~gKl1lH1)mI0QlJkx1*1,3M0%0k7F0yfP1z3b7X1h1Voaoc1yof0*e|2d040Lccb)lB9ZltmBgLmPnr040c22mWl*22mZgJ11ktmSa/0^kk1pmukrmx1z3f0^0G0^0 lhm+l80ofVb5m`7Q1I04b(2B0Goxk?ozmOgNh3o-n00o1o2nm{m$k20Vo2lJj/05o705mKlP78hLnIm@oNh`n!nz21h=0G0BhGpm0^228eo3lKo5lMpvlOk:8Dm|7voQh^0knbhG8;30n}15kSkGkU2%pmkY1Mk!8smsk(lmhfkJ7BkCgdkIk*0zp41jpukyo5oElvm`nDlqlAoUlEkP3b0M15391+kZlbpT2*15oWlg8QpVmupQ0i30lHmJo5k:e+lq2bl6ken6n/myn!2s0/6{7sk?0rp|1L000Oh{7u1y8slal#718;0|kPdTm:pXk,npo4p-040_0tplkXq0gkh_pSoWoYo!o?7Gm myn5mUoGkQ2t0%0:cn1nk3pA2D0@2tk?qqqin6dTk.0$mr0V00q:2!lymV7VkOoHn-oKm$b9qLk*c;h8gU0o0*3vpe78m^m`m|hAm pQ7r1znbq{h{0^na0(oP0%m#lt2%7^ke0okZ0yoX1N0V12kP0frR0Ml^mgqEq2l6pS1LnuhzrBrDpqnv22rKp=7F390Vf=qe040Wnwr/kgqqqsnCm+b)2+9AoPmyd{q?kgh2o(n%0Gk|jH0klzcule1,oP2%rRle1I0QqIm19iqdpx0}p8jX10121404.
Astuce (1)

Faites quelques essais. Avec "RANG" et "SARAH" par exemple...

Astuce (2)

La liste triée des anagrammes de "SARAH" contient tout d'abord les anagrammes débutant par "A", puis ceux débutant par "H" etc

Astuce (3)

Le nombre d'anagrammes d'un mot de \(N\) lettres dans lequel chaque lettre est répétée \((n_0, n_1, ...,n_k)\) fois (\(n_0+ n_1+ ...+n_k = N\)) est égal à :

\[\frac{N!}{n_0!\times n_1!\times ...\times n_k!}\]

On rappelle que \(N! = N\times (N-1)\times (N-2)\times ...\times 1\). On convient si besoin que \(0!=1\).

Astuce (4)

On peut utiliser un code récursif. Si l'on souhaite déterminer le rang d'un mot, il faut déjà compter le nombre d'anagrammes débutant par une lettre placée plus tôt dans l'alphabet puis lui ajouter le rang du mot privé de sa première lettre.

Le rang de "SARAH" est par exemple égal :

  • au nombre d'anagrammes débutant par "A", par "H" et par "R",
  • additionné au rang de "ARAH".

Un mot de une lettre a toujours un rang égal à 1 !