Nous allons utiliser ce qui a été dit dans l'encadré \og À retenir \fg{} du corrigé de l'exercice \ref{anagrammes}.
\begin{questions}
\item Dans le mot \og MATHEMATIQUES \fg, il y a:
\begin{itemize}
\item 2 fois la lettre \og M \fg;
\item 2 fois la lettre \og A \fg;
\item 2 fois la lettre \og T \fg;
\item 2 fois la lettre \og E \fg.
\end{itemize}
Il comporte de plus 13 lettres en tout. Le nombre d'anagrammes de ce mot est donc égal à:
\[
\dfrac{13!}{\big(2!\big)^4}=\numprint{389188800}.
\]

\item Le mot \og URLUBERLU \fg{} comporte 9 lettres dont:
\begin{itemize}
\item 3 \og U \fg;
\item 2 \og R \fg;
\item 2\og L \fg.
\end{itemize}
Le nombre d'anagrammes de ce mot est donc égal à :
\[
\dfrac{9!}{3!\times\big(2!)^2}=\numprint{15120}.
\]
\item Voici un programme possible:

\qrset{height=1.1cm,version=5}\rput(-1,-0.7){
\psframebox{\qrcode{https://idl-live.prepamath.fr/ILTM/anagramme-2023.py}}}
\rput(-0.5,-1.7){\PictoNathanLive[Prog]}
\vspace*{-3mm}

\begin{listing}{}{anagramme-2023.py}
\end{listing}

\newpage

Voici quelques explications:

\begin{itemize}
\item Avant tout, on importe la fonction \texttt{factorial} du module \texttt{math} afin de pouvoir calculer les factorielles simplement;
\item ensuite, on demande de saisir un mot (à l'aide de la commande \texttt{input}), que l'on va stocker dans la variable \texttt{mot} (autant que le nom de la variable soit explicite);
\item l'instruction \og \texttt{n = len(mot)} \fg{} calcule le nombre de lettres du mot et stocke le résultat dans la variable \texttt{n};
\item on créé ensuite un dictionnaire, que l'on nomme \texttt{dico};
\item la boucle \og \texttt{for lettre in mot} \fg{} a pour but de parcourir le mot saisi, lettre par lettre;
\item si la lettre rencontrée n'est pas déjà dans le dictionnaire alors on l'insère, avec une valeur égale à 1 car c'est la première rencontrée;
\item sinon, on affecte à la variable \texttt{nb} la valeur de la lettre rencontrée (c'est-à-dire le nombre de fois où elle a déjà été rencontrée), et on remplace cette valeur par elle-même augmentée de 1 (puisqu'on rencontre à nouveau cette lettre);
\item à la fin de la boucle \og \texttt{for} \fg, le dictionnaire est composé de toutes les lettres du mot, ayant pour valeur le nombre de fois où elles apparaissent dans le mot;
\item ensuite, on initialise la variable \texttt{P} à 1; elle va représenter le produit des factorielles par lequel on va diviser $n!$;
\item on parcourt le dictionnaire avec la boucle \og \texttt{for cle,valeur ...} \fg{} et à chaque passage, \texttt{P} est multiplié par la factorielle du nombre d'occurrences de la lettre sur laquelle on est;
\item une fois la boucle finie, on divise $n!$ par la valeur stockée dans \texttt{P} pour avoir le nombre d'anagrammes.
\end{itemize}

\begin{Remarque}
la présence de \texttt{int} dans le calcul de \texttt{N} n'est pas obligatoire, mais nous avons souhaité le mettre pour avoir un affichage de la valeur sans point décimal.
\end{Remarque}

Conscients que la notion de dictionnaire en Python vous est peut-être étrangère, nous allons voir une deuxième possibilité avec le programme page suivante.

\qrset{height=1.1cm,version=5}\rput(-1,-0.7){
\psframebox{\qrcode{https://idl-live.prepamath.fr/ILTM/anagramme2-2023.py}}}
\rput(-0.5,-1.7){\PictoNathanLive[Prog]}
\vspace*{-3mm}

\begin{listing}{}{anagramme2-2023.py}\end{listing}

\Par

Dans ce dernier programme, l'idée est de parcourir le mot lettre par lettre (avec la boucle \og \texttt{for lettre in mot} \fg) et de créer un couple, noté \texttt{c}, formé de la lettre et de son nombre d'occurrences $k$ dans le mot. Si ce couple est dans la liste \texttt{L} (initialement vide) alors on l'insère dans la liste et on multiplie par $k!$ la valeur stockée dans \texttt{P}.

Ainsi, la boucle finie, \texttt{P} contiendra la valeur par laquelle on doit diviser $n!$.
\end{questions}
