Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

TROUVER TOUS LES ANAGRAMMES D'UN MOT


Description

Bonjour à tous. Ce code permet de lister tous les anagrammes d'un mot.
C'est vraiment un code pour débutant, et c'est peut-être pour cela que l'on ne trouve pas de source.
Donc ce code très court, liste tous les anagrammes d'un mot.
Une fonction permute permet de changer deux à deux la place de deux lettres, et la fonction factoriel permet de calculer le nombre d'itértation totale.
J'espère qu'il servira ;)
++Mik
 

Source

  • <?php
  • function permute($mot,$i,$j){
  • $tmp=$mot[$i];
  • $mot[$i]=$mot[$j];
  • $mot[$j]=$tmp;
  • return $mot;
  • }
  • function factoriel($n){
  • if($n == 0){ return 1; }
  • return $n*factoriel($n-1); // retourne le nombre courant $n multiplié par $n-1 *$n-1-1 etc..
  • }
  • $mot="aze";
  • echo $mot."<br>";
  • $nb=factoriel(strlen($mot));
  • echo "Facto :".$nb."<br>";
  • $j=0;
  • $k=1;
  • for ($i=0;$i<$nb;$i++){
  • if ($k==strlen($mot)){
  • $k=0;
  • }
  • if ($j==strlen($mot)){
  • $j=0;
  • }
  • $mot=permute($mot,$j,$k);
  • echo $mot.":".$j.":".$k."<br>";
  • $j++;
  • $k++;
  • }
  • ?>
<?php

function permute($mot,$i,$j){
 $tmp=$mot[$i];
 $mot[$i]=$mot[$j];
 $mot[$j]=$tmp;
 return $mot;
}

function factoriel($n){ 
if($n == 0){ return 1; } 
  return $n*factoriel($n-1); // retourne le nombre courant $n multiplié par $n-1 *$n-1-1 etc.. 
}

$mot="aze";
echo $mot."<br>";
$nb=factoriel(strlen($mot));
echo "Facto :".$nb."<br>";
$j=0;
$k=1;
for ($i=0;$i<$nb;$i++){
  if ($k==strlen($mot)){
   $k=0;
  }
  if ($j==strlen($mot)){
   $j=0;
  }
  $mot=permute($mot,$j,$k);
  echo $mot.":".$j.":".$k."<br>";
  $j++;
  $k++;
}

?> 

Commentaires et avis

signaler à un administrateur
Commentaire de malalam le 10/10/2006 14:58:38 administrateur CS

Hello,

rigolo :-)
Par contre, tu ne prends pas en compte les lettres apparaissant plusieurs fois dans le mot.
Essaye avec 'radar', tu verras que tu trouves bien trop d'anagrammes ;-)

signaler à un administrateur
Commentaire de opossum_farceur le 10/10/2006 16:01:24

Salut,
Ton code est correct seulement pour les mots de 3 caractères différents. Dès que l'on passe à 4 caractères, apparaissent les doublons, au détriment d'arrangements qui eux sont escamotés.
En bref, t'as encore du travail...

signaler à un administrateur
Commentaire de Alain Proviste le 10/10/2006 19:34:12 administrateur CS

coucou, j'ai un algorithme optimisé de ceci, en vb.net donc facile à comprendre, demande moi si tu veux

pour ce que dis malalam, sache que rajouter un if pour savoir si une lettre a été déjà été traitée (dans le cas de mon algo en tout cas) ne fait perdre que quelques miserables % dans les temps de traitement.

sinon tu peux regarder la source de bricomix qui traite de ça, son algo (vb6) est le meilleur sur les sites ( à ma connaissance )

signaler à un administrateur
Commentaire de Alain Proviste le 10/10/2006 19:35:47 administrateur CS

en lisant ton code je suis assez étonné, car je ne crois pas qu'une fonction non recursive puisse fonctionner pour ce traitement...

signaler à un administrateur
Commentaire de BTAJV le 10/10/2006 20:01:13

voila mon code ac des petites modifs lol
<table border="1" cellpadding="1" cellspacing="0">
<?php
  
function permute($mot,$i,$j){
  $tmp=$mot[$i];
  $mot[$i]=$mot[$j];
  $mot[$j]=$tmp;
  return $mot;
}
  
function factoriel($n){
if($n == 0){ return 1; }
   return $n*factoriel($n-1); // retourne le nombre courant $n multiplié par $n-1 *$n-1-1 etc..
}
  
  $mot=($_POST['mot']);
//$mot="aze";
echo $mot."<br>";
$nb=factoriel(strlen($mot));
echo "Facto :".$nb."<br>";
$j=0;
$k=1;
for ($i=0;$i<$nb;$i++){
   if ($k==strlen($mot)){
    $k=0;
   }
   if ($j==strlen($mot)){
    $j=0;
   }
   $mot=permute($mot,$j,$k);
   echo "<tr><td>".$mot."</td><td>".$j."</td><td>".$k."</td></tr>";
   $j++;
   $k++;
}
?>
</table>
<form method="post" action="nom.php">
   <input type="mot" name="mot" />
    <input type="submit" name="Submit" value="GO">
</form>

signaler à un administrateur
Commentaire de Arto_8000 le 12/10/2006 03:03:05

J'ai légèrement modifier le code pour qu'il puisse enlever les doublons. Pour l'instant avec cela je peux seulement calculer toutes les possibilités sans doublons d'un mot de 9 lettres. Quelqu'un a une idée pour optimiser davantage?

<?php
$temps = time();
function permute($mot,$i,$j){
$tmp=$mot[$i];
$mot[$i]=$mot[$j];
$mot[$j]=$tmp;
return $mot;
}
  
function factoriel($n){
if($n == 0){ return 1; }
  return $n*factoriel($n-1); // retourne le nombre courant $n multiplié par $n-1 *$n-1-1 etc..
}
  
$mot='abcdefghi';

echo 'Votre mot :'.$mot.'<br /><br />';
$nb=factoriel(strlen($mot));
$mots_trouve = $mot;

$j=0;
$k=1;
for ($i=0;$i<$nb;$i++){
  if ($k==strlen($mot))
   $k=0;
  if ($j==strlen($mot))
   $j=0;
  
  $mot=permute($mot,$j,$k);
  if (strpos($mots_trouve,$mot) === false)
  {
echo $mot.':'.$j.':'.$k.'<br>';
$mots_trouve .= '|'.$mot;
  }
  $j++;
  $k++;
}
  
echo '<br />Nombre trouvé :'.count(explode('|',$mots_trouve)).'</br>';
echo 'Temps: '.(time()-$temps).' secondes';
?>

signaler à un administrateur
Commentaire de opossum_farceur le 12/10/2006 18:22:38

ARTO_8000,

Et $nb, qu'est-ce que t'en fais?
Avec le mot 'abcdefghi', $nb (nombre de permutations de cet ensemble de 9 objets différents), est égal à 9!, soit 362880.
Ton script n'affichant que 72 permutations (censées être différentes, mais as-tu vraiment vérifié?), il ne reste plus qu'à trouver le moyen d'afficher les 362808 permutations restantes.
Autant dire qu'il y a du boulot.

signaler à un administrateur
Commentaire de Arto_8000 le 13/10/2006 00:06:27

En théorie j'ai seulement rajouter quelque chose pour enlever les doublons. Aussi j'ai brièvement vérifier et je me suis rendu compte que l'algorythme répète souvent les mêmes résultats. Essaie avec le mot "abcdefghi" et tu verras que les permutation finnissent par se répèter, même s'il ne devrait pas. Les 72 permutations trouvés sont celle que son algorythme a permis de trouver et non un défault de mon code.

signaler à un administrateur
Commentaire de mikabou le 18/10/2006 15:49:45

Je vous remercie pour tous ces compléments d'information!!! :)
Je pense que pour traiter les doublons, je vais trier tous les mots dans un tableau, puis faire un dernier balayage pour éliminer tous les intrus :p
Je ne m'était pas interessé à ce problème...en php je me contente de faire de petites fonctions, préférant d'autres langage dès que le temps de calcul dépasse les 30 secondes standard :p
...et pour trouver les anagramme d'un mot de 9 lettre...je n'utiliserais pas non plus le php ;)
Encore merci à vous :)
++Mik

signaler à un administrateur
Commentaire de dobro le 28/10/2006 15:36:46

tiens voila un code qui marche niquel
il est en basic standard (aucune specificité)
donc il doit etre transposable dans tout language informatique je pense...
voila :
Print("Entrez un mot et appuyez sur 'Return': ")
m$=Input()
n= Len(m$)
Dim mo$(n)
Dim p(n)
mo$(n)=m$
z=n
rt:
p(z)=1
dt:
mo$(z-1)=Right(mo$(z),z-1)
z=z-1
If z>1
    Goto rt
EndIf
m$=""
For w=1 To n
    m$=Left(mo$(w),1)+m$
Next w

Print(m$+" ")

gt:
mo$(z+1)=mo$(z)+Left(mo$(z+1),1)
z=z+1
p(z)=p(z)+1
If p(z)<=z
    Goto dt
EndIf
If z<n
    Goto gt
EndIf


Print("FINI !!!!")

k$=Input()

signaler à un administrateur
Commentaire de mac13 le 15/12/2006 19:39:37

bonsoir a tous j'aurai voulu savoir s il serai possible d'adapter cet algorithme a une calculatrice?? merci bien ciao

signaler à un administrateur
Commentaire de Arto_8000 le 16/12/2006 16:43:20

Mac13 -> Tu parles des Ti83 et Ti83+ ?

signaler à un administrateur
Commentaire de mac13 le 16/12/2006 18:07:58

oui c'est ça !!

signaler à un administrateur
Commentaire de Arto_8000 le 16/12/2006 23:08:35

La façon la plus facile serait de la faire en Basic un language implenté dans les ti qui est relativement simple. J'ai jamais fait beaucoup de programmation avec, mais tu peux facilement trouver de l'information la dessus sur le web.

Sinon si tu es très expérimenté dans la programmation il y a aussi l'option de le coder en ASM Z80 et de le transféré sur ta calculatrice ensuite.

http://jlpti83.free.fr/?rub=tibas
http://www.ftp83plus.net/Tutorials/TI83pAsmTut.htm

signaler à un administrateur
Commentaire de dobro le 17/12/2006 00:54:23

"La façon la plus facile serait de la faire en Basic"

ben c'est ce que je lui est fait 4 message plus haut !!..

signaler à un administrateur
Commentaire de Arto_8000 le 17/12/2006 18:38:07

Dobro -> C'est pas du tout le même Basic ... c'est légèrement différent. Sur les ti il n'y a pas du tout de Dim, de fonction Left, etc. D'ailleur il y a un tutorial qui vient de sortir là dessus sur le site du zéro.

http://www.siteduzero.com/tuto-3-1524-0-le-ti-basic.html

Tu regarderas par toi-même que c'est pas du tout la même chose.

signaler à un administrateur
Commentaire de dobro le 17/12/2006 19:05:11

ha ! Ok !! Sorry :D

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Zone de liste [ par Joez ] voila j'ai une table MysqlNumNomPrenomcomment remplir une zone de liste sur une page php ?Cette liste doit contenir le nom et le prenom sur la meme li liste deroulante liées entre elle [ par jodenki ] J'aimerais lier deux liste déroulantes entre elle :C'est à dire que quand je selectionne un element dans la première, la deuxième soit automatiquement Liste déroulante lié a une base MySQL [ par pi0up51 ] Je sais faire ça en asp mais pas en php, ça doit pas être bien compliqué mais si qqn peut m'aider ;)@tte et bonn' prog'pi0up51http://www.progotop.ht.s zone de liste dynamique [ par pheno ] est ce que qqun sait comment on fait pour mettre dans une zone de liste le contenu d un champ d une base de donnee mysql ????ce que j ai fait &lt;sel liste deroulante liée [ par pheno ] bonjour comment est ce k on peut faire pour lier 2 zone entre elles ????Merci d avanceChevalier Pheno Starboard, membre de la Freeman-Corp prob avec des listes deroulantes [ par toto99 ] voila mon prob est le suivante:-------------------------------------------j'ai une premiere liste deroulante qui ce remplit directement par raport a m boucle [ par toto99 ] voila je recupe des dates dans une liste deroulante suvant un choix qui ce trouve dans une autre liste deroulante, tous les deux sont alimenter par un J'ai du mal j'ai besoin d'aide [ par satanik_mike ] Bonjour, je viens vous demander de l'aide car je bloque sur un truc qui paraît bête mais qui me fait c..... En fait mon problème se pose sur une page Boite à liste conditionnée par une autre boite [ par olive59 ] Source en PHP avec base MySqlJ'alimente une boite à liste avec une base MySQL. Jusque là, tout va bien! (Par un SELECT * FROM ...)J'aimerais pouvoir a Boîtes à liste + PHP + MySql [ par olive59 ] Source en PHP avec base MySqlJ'alimente une boite à liste avec une base MySQL. Jusque là, tout va bien! (Par un SELECT * FROM ...)J'aimerais pouvoir a


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,187 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.