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
.128013s3_8èufvIy 7nGaêS1me(P4C2:jtwi]ç[hE*)6Oo;bcdUgM/T0lîàqABp!.rL-,}=+Nk{95Rxé050S0u0C0p0E0Z0b0l0R0Z0p0b0b0;010C0E0)010406050b0g0t0t0p0,0k040r0O0Z0g1e0O0n0l020p0t0)0P0l0{0u1o0,0$0g0u0b050W1l1n1p1r1j0)041P1W051Z0W1Z1#1W1j0S0E0i16181a1c0I0E0U0I0Z1?0I0C1h05110Q0Z0u1.191b011=1@1_1@0C1 211}0C0Q0O0S1r1~0,1X0C0I161u0b0)0p0n1c0z01231:010h130u0n1C0u1}2r2t2y252B212E0t2G040a0l0w0,0O0)0O0b0E1x1z0 2p0,0,0u0R2#1P2I0n1X0W2n2;0C2l2k2m0S2K1c1_0n2D2Y1}1+1-17242~0E300n2h1,1}0)2*1X2/2;3i1k2s1z362z3b0,1o0Z1h0l0s2.3m1i3l2J3o253q3s3u0z3x2t3z2/2}013E0p3t040l0c3I2:1j3L3C1c3O3Q0l0x3U3K3m3M3!3u0`3(3W3*3Y3N0O3r3P3u0M3/3A3n1/3D3@3F3R0m3|3X3 3Z413_3R0e453;473?3^3#0_4d3B4f3,040s0Y4k3~374g420s3w1Q3y3:4l4t4n0s3H4y3J4A4s3p493Q0s3T4G3V3}3+4L1h0s3%4P3)4B4K4h4U3.4X4I4S4#4o3{4(4R3=4D444.464C4T4o4c4?4e4^4+0s4j4|4Z404+0z4q524J54420z4x3i4)4:4_0z4F5e4/4m5h4O5k4@4!5b4W5p4}5r4a0z4%5u5348554-5A595C5b4=5F4*5b4{5K5g55515O5m4+0c575S4~420c5d4z5l5Y4a0c5j5$5q5a5)5o5,5v5.3Q0c5t5;5B4u5)5z5`5G5|5@5E5 5L5)5J645P5Z5N685T5Z5R6c5(3Q0x5W6g5w6i5#4H5%6m1h0x5+6p5-5H4a0x5:6v5=6x6i5_6B5{4n0x5~6G606I636L656i676P696y6b6T6d6y6f6X6h1h0`6k6#6r040`6o2:1Y3g1P342@0S2{3M0R2h2Q0~1,1X3f0u3h3y3(056{0 735{0@1h0 0h756w010D3u7f6C3N0h1h0O0R0R0g2)2D0R1N7k5{1g040v7x6M1h0t0O0C7C3M7z0L0A3/0l7O0l6q3D7c2+0O1D0C7w4X7Q7g0O1h0;3(7!7l7z0^0:7N7P7R1c7b040h3@7)7;3N1h212b2*7`7#7i0439817l0n7E7G7I3=7z7M4(7P8g7*7a1h0E7e7Z7{88047~2^0u865{0O83858n7g8p0 6{7W7Y3k7g8d7/8h8h8o7T8D0)7X1O4X7{7z0H8b4m7}108s8W4t7z0F8u607$040=7(8z7l0t0E4U8J8L7g7?0u148t8S8H1h8e5e8K8K8M048C7V8P8F748 048V8~878Y7 8}8G7+1h8(8/8v7%8)3M8;8?8f7:8_1h2*0C7s0n9r4:8N988Q3/065f4f7?7d8#2z837Q9f6H7n7@0p2,3@0E8{219O257z7B9S7D049C9*7J1h7L8@7{7?8l9D8X9,9_4t8+0;8.3i8i609t046)6/9c914z93a23M7?9z9B9|2za46.1i8g9?9y10ag9o9+9-a17{8+0Kah7S9V9X0,9Z0Z9#9.8c1h9)9k6H1hat3yac3=8+0.ay1caj9$1c7K9I9K4t9M0u8maK609QaW7m7E0g0Z1e3b8;3Pa,9(a,8paN3J8T1h0/aT7|042*0)102!0E1y8Ra)9/049;9v7O956{a%a(aOav9qar3+1h0h9W0C9Y9!9j9b9l7Aa`aMa^9:9=9x7@7_bo9E040|b18w8ka|2:aP9`b4b62#babx7y908@am8A1hbi0hbk3JbR9}1h0W0Wa0blb$aAbtaCbvbCbzaG9`bLb}8$bDbfb,2zaeap0,bP3Rbh0ObjaZan96a%a,a+c03p9U0,2t0Ub{aJbX9+7F7Hck9%9:a94Hb#7l9@b*bQ8o0Q8Yc9a~b|bbbJcub{0LbM7%b;b+7{aVcwaXbZc3cB8jb3c7c9c425cW5e06c#9+0Z1y0U1M7scR04cTcF8AcH8q2DcqbA04cOcX01aYc395978EbWcU7#bnaub?7p7r7t0n7vdca7bycra}b?d4cM4fd7929w9g04710b2D9HbI4f9~b18Ud28r80dFa#bqbHdgdzdLbwdd7lbN84c)d97Udbb{9ndxbgb?dT0b0d2^9Z9adV9pc`b10nc~0b3@7X0Sd1d58pdBdDd;dobYbdbEdzbt110Zc_c{ca7ga4a6aldyaL84edb1ehe8c$0D1=aFdReld,d.b_e47960dJe08kd%c_0*eec*3Z89cvduc19da,epd58%cz3Vabd!0Q1wendN3p9h8sd-d/0ueAcK9eeOe%emeT9mb!ek9+bT1ebVe#eveC1h0Hd(aa93cf7^0,d^e(dMe 3MdX8yfcbJe20ndEe:cx04eVejabd*cC8kcEefdS8Zfbb=dW1heIf9cgeZeNcsbcfoc.fq94b?e{b7b9a,8+0+d20p0)b50nd~e?cLfHbJda99dneBbce/f$9`dTd%cQc!f5bF8{dCb{fJfLfMdzfOe}d5fSfUfW2DfZflcYf#drdzf(fkf.ePf-gbewfxdUe5f004f3d=8*1haSe$c+8=4ocPe^freleaa@gu1c8+8-fD0ta/a;7V0EgDg8d6aIdKc=c@f8gE01aReogwakcKb0gW8pg0b80nf*cKf=d)8^dz0Ec_gHgWc,f4gA60c69Ac8fDgCecgWgGfDcn0ncpf!dqgmbpd38af!ghhc3=g`gign0A0Fg/4z9J7{0R0s1h030l0X1N0Cf*a!c51h240u0,fGgqhdh7h9gPa_d50b2w04010o0%0-0%01gyh4cSgZ1h6Whidva b1hQ1h010J7t7s0l1l0,0l210lhL0l2%hUhWhY58adhE1ahGhIc|f cod gPh-hS0(0yhXhZfgdGh#g_gw6Fh)ePg%ij4tidh/h;h^h@h_22h|2%ifihi23=7?hFhHh6iahaa,iu0%0(0%0%ig0yi1hNc2is2z9~eJcVgw5*b{irfz5{iuh:2*h=iyh`iB22iPiRiTiV6l25iHi5iJg(9yiLiWgaip2zi-0?0T0V0J0{0%0X0j0N0?i{hlbchphJaQiliYgv4U0_0m0s0e0Meig$h,hRivi/ixh=i=coh}220Jj9jbjdjfjhjj4Q0W77726:jU0W6?1P0C6^jZ2_2=2g2i2@0p20jW6?1Vf+3=2*0t0dbr0@0u0d0I0c1h1H1J1L1N0lfo1Y3z1W0N1z3@0U2t0EdCiz2p2%2D0l0)1v2Z0u7s157^dlbVk4k61ja/3z1_k71XjT04di7s2*dl7YkC2p8Ekga=0Q2*h}00kEdkdmjI160I0pk2iz9ih}2t15766|hecvkC0+0lk9kkko0C0l1w13kehGkg0,0}1la:0pk?0p2B2$221_0b7Xh^2115d,kkk}dCfjk30Sk%7QkCd4kJ0A1622d{fjiz1517k~h}0gh}0E2,g+2E0E2*fT1$3z0Wkz1jlL1!kBk*braBaDaFkJkG0i0O9Zh_0p0llRb^lT220S000g1zdD9Zh^2X2Z1e0hllk*9-k-k/1zk^l7l6220R19kV0Q1922k)781z9 0l57kJ2Xi:0E1D1_2Bk{h`m30Z7r0Zk$g,l!l$1ylC1yl_78gJa:39gMgDk-kv1PlNlN1ZlmgKmDa?h3kJmomqm10lkNkP2%b53r1wl1g+15l+l-0l2DdC0tj-kVm972l{k*0l0}0Z0}2Pfj0b0/m+1z7X2Elt8O7XjI15k}0)0}e|m%mv9B9Zm(lkm;c%b5ncfQjSk*k.mH1W0r0Ek@30n70l0i3Pko0,m(m8kCg*1y1PkJnz1wmzm24f271^1`1|j;4feS3kno78m 182p0n0il/my0YeI0sk;3r10kVbtnL2%0t0q2P163PmTlaiAk~gKl1lH1)mI0ElJkx1*1,3M0p0S7F0nfP1z3b7X1h1Voaoc1yof0.e|2d040yccb)lB9ZltmBgLmPnr040-22mWl*22mZgJ11ktmSa/0}kk1pmukrmx1z3f0}0R0}0 lhm+l80lfVb5m`7Q1I04b(2B0Roxk?ozmOgNh3o-n00l1o2nm{m$k20bo2lJj/05o705mKlP78hLnIm@oNh`n!nz21h=0R0IhGpm0}228eo3lKo5lMpvlOk:8Dm|7voQh^0SnbhG8;30n}15kSkGkU2%pmkY1Mk!8smsk(lmhfkJ7BkCgdkIk*0Lp41jpukyo5oElvm`nDlqlAoUlEkP3b0g15391+kZlbpT2*15oWlg8QpVmupQ0!30lHmJo5k:e+lq2bl6ken6n/myn!2s0,6{7sk?0Bp|1L000#h{7u1y8slal#718;0fkPdTm:pXk,npo4p-040w0OplkXq0gkh_pSoWoYo!o?7Gm myn5mUoGkQ2t0p0Ucn1nk3pA2D0G2tk?qqqin6dTk.0jmr0b00q:2!lymV7VkOoHn-oKm$b9qLk*c;h8gU0l0.3vpe78m^m`m|hAm pQ7r1znbq{h{0}na0CoP0pm#lt2%7^ke0lkZ0noX1N0b12kP0vrR0gl^mgqEq2l6pS1LnuhzrBrDpqnv22rKp=7F390bf=qe040Tnwr/kgqqqsnCm+b)2+9AoPmyd{q?kgh2o(n%0Rk|jH0Slzcule1,oP2%rRle1I0EqIm19iqdpx0Wp8jX10121404.
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 !