begin process at 2008 05 17 06:22:40
1 173 917 membres
49 nouveaux aujourd'hui
13 973 membres club

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

?> 

  • 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

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

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

Boutique

Boutique de goodies CodeS-SourceS