begin process at 2010 02 10 06:20:49
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > TROUVER TOUS LES ANAGRAMMES D'UN MOT

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++;
}

?> 




 Sources de la même categorie

Source avec une capture CALCUL DE TVA MARGE AVEC REMISE FOURNISSEUR SPÉCIALE POUR LE... par lcomb
Source avec Zip EVALUER UNE EXPRESSION À PARTIR D'UNE CHAINE DE CARACTÈRE par TheWeasel47
FONCTION EQUATION LÉGÈRE par ff5
Source avec Zip Source avec une capture TRACEUR DE COURBE EN COORDONNÉES CARTÉSIENNES (MAJ) par fredbonmatin
CONVERTIR LES RÉFÉRENCES DE COLONNE EXCEL DE CHIFFRE EN LETT... par computman007

 Sources en rapport avec celle ci

SEARCH QUERY COMPOSER par Centauriel
Source avec une capture IMAGES GENETIQUES par coucou747
Source avec Zip Source avec une capture RECHERCHE ET LISTE par liptibilly
SUITE LOGIQUE par Palleas_44
Source avec Zip LABYRINTHES EN PHP (GD + HTML) GÉNÉRATION + RÉSOLUTION par nax333

Commentaires et avis

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 ;-)

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...

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 )

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...

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>

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';
?>

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.

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.

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

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()

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

Commentaire de Arto_8000 le 16/12/2006 16:43:20

Mac13 -> Tu parles des Ti83 et Ti83+ ?

Commentaire de mac13 le 16/12/2006 18:07:58

oui c'est ça !!

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

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 !!..

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.

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...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,484 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales