IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

[Algo] Permutations et arrangements


Sujet :

Algorithmes et structures de données

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 99
    Points : 126
    Points
    126
    Par défaut [Algo] Permutations et arrangements
    Salut,

    j'ai une question d'algo que je n'arrive pas à résoudre, pas que j'en ai vraiment besoin mais la démarche pour résoudre ce problème m'intéresserait. j'arrive avec une procédure récursive à générer tout les arrangements de lettres possibles en dessous d'une certaine taille de mot. Le programme donne une sortie comme suit:

    a aa aaa aab aac aad ...


    Le problème est que je n'arrive pas à trouver l'algo pour avoir une sortie du type:

    a b c d ... aa ab ac ...zz aaa aab...

    Je sais que ça fait un peut crackeur de mot de passe mais j'aimerais tout de même avoir votre avis sur la méthode à utiliser pour avoir une sortie de ce type car ça fait un moment que je me triture les neurones... (et ne vous inquietez pas, ce n'est pas à des fins peu louables )

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Ca devrait fonctionner a peu pres:
    Desolé pour ceux qui n'aiment pas PASCAL!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    function Donne_valeur_suivante(ch:string)
    const 
    DEBUT='a';
    FIN=char(ord('z')+1);
    var l:integer;
    begin
    l=length(ch)
     
    repeat
    ch[l]:=char(ord(ch[l])+1); //On prend le suivant
    if ch[l]=FIN
    then ch[l]=DEBUT;
    dec(l);
    until (l=0) or (ch(l+1)<>DEBUT)
    if l=0
    then ch=DEBUT+ch;

  3. #3
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 99
    Points : 126
    Points
    126
    Par défaut
    A vrai dire c'est une bonne piste mais pas vraiment au point... Ca se plante assez rapidement.

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    En c on peut peut-être écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    void ecriremot(char *motdejafait, int nbl)
    {
       int i;
       char tmp[100];
       for(i = 0; i < 26; i++)
       {
           sprintf(tmp, "%s%c", motdejafait, 'a'+i);
           puts(tmp);
        }
        if (nbl > 1)
        {
            for(i = 0; i < 26; i++)
           {
              sprintf(tmp, "%s%c", motdejafait, 'a'+i);
               ecriremot(tmp, nbl-1);
            }
         }
    }
    Tu fais l'appel avec ecriremot("", 5) par exemple.

  5. #5
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 99
    Points : 126
    Points
    126
    Par défaut
    Eh ben non, raté encore une fois... Je l'ai traduit en delphi, ça donne qqchose comme ça, j'ai peut-être fait une erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
      procedure EcrireMot(ch: string; nb: integer);
      var
        i : integer;
        tmp: string;
      begin
         for i := 0 to 25 do begin
          tmp := ch + chr(ord('a') +  i);
          memo1.Lines.Add(tmp);
        end;
        if nb > 1 then
          for i := 0 to 25 do begin
            tmp := ch + chr(ord('a') +  i);
            EcrireMot(tmp, nb - 1);
          end;
      end;
    la sortie est :

    a ... z aa ab... az ... aaa aab

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Je ne comprends pas bien :
    Tu dis au début que tu n'arrives pas à avoir la sortie :
    a b c d ... aa ab ac ...zz aaa aab...
    Avec l'algo que je te propose tu obtiens
    a ... z aa ab... az ... aaa aab
    et ça ne te va pas ?
    Est-ce parce que ton prog s'arrète à aab (dans ce cas tu as une erreur quelque part) ou ce n'était pas ce que tu voulais au départ ?

  7. #7
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 99
    Points : 126
    Points
    126
    Par défaut
    Pardon, je l'ai mal noté. La sortie de ton prog est:

    a ... z aa ab... az aaa aab

    sans faire az ba bb bc ... etc

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Si, mais pas dans le bon ordre effectivement
    Il me vient une idée, tu dérécursives, mais au lieu d'empiler tu enfiles les données à traiter
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	enfiler ("", 3)
    	tant que la file n'est pas vide
    	debut
    		defiler(chaine, longueur)
    		pour car de 'a' à 'z'
    			afficher chaine+car
    		si longueur > 1 alors
    			pour car de 'a' à 'z'
    				enfiler chaine + car, longueur - 1
    		fin si
    	fin
    Je n'ais pas le temps d'essayer, mais ça pourrait bien marcher !
    Prévois une file longue !!!

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    c'est fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    typedef struct file
    {
    	struct file *suivant;
    	char mot[10];
    	int len;
    } file;
     
    file *ptrfin, *ptrcur;
     
    void deletepile(void)
    {
       delete ptrcur;
    }
    void initfile (void)
    {
    	ptrcur = new(file);
    	ptrfin = ptrcur;
    }
    void enfiler (char *mot, int len)
    {
    	strcpy(ptrcur->mot, mot);
    	ptrcur->len = len;
    	ptrcur->suivant = new(file);
    	ptrcur = ptrcur->suivant;
    }
     
    int filevide (void)
    {
    	return ptrfin == ptrcur;
    }
     
    int defile(char *mot, int *len)
    {
    	if (filevide())
    		return 0;
     
    	strcpy(mot, ptrfin->mot);
    	*len = ptrfin->len;
    	file *tmp = ptrfin;
    	ptrfin = ptrfin -> suivant;
    	delete tmp;
    	return 1;
    }
     
    int main(void)
    {
    	char tmp[50];
    	char mot[50];
    	int len;
     
    	initfile();
    	enfiler("", 3);
    	while (filevide() == 0)
    	{
    		if (defile(mot, &len) == 0)
    		{
    			puts("Pb");
    			return(0);
    		}
    		for(int i = 0; i < 26; i++)
    		{
    	       printf("%s%c ", mot, 'a'+i);
    		   if (len > 1)
    		   {
    				sprintf(tmp, "%s%c", mot, 'a'+i);
    				enfiler(tmp, len - 1);
    		   }
    		}
     
    	}
        deletepile();
    	return 0;
    }

  10. #10
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 99
    Points : 126
    Points
    126
    Par défaut


    Bravo ! Le résultat est parfait... Pour ce que ça intéresse, une petite traduction en Delphi. Non exempte d'erreurs car faite en fin de week end ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
     PFile = ^TFile;
     TFile = record
       Suivant : PFile;
       Mot : string;
       len : integer;
     end;  
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      PtrFin, PtrCur : PFile;
     
      procedure DeleteFile;
      begin
        Dispose(PtrCur);
      end;
     
      procedure InitFile;
      begin
        New(PtrCur);
        PtrFin := PtrCur;
      end;
     
      procedure Enfiler(Ch : string; Len : integer);
      begin
        PtrCur^.Mot := Ch;
        PtrCur^.Len := Len;
        PtrCur^.Suivant := New(PFile);
        PtrCur := PtrCur^.Suivant;
      end;
     
      function FileVide: boolean;
      begin
        Result := PtrFin = PtrCur;
      end;
     
      function Defile(var Ch: string; var Len : integer): boolean;
      var
        tmp : PFile;
      begin
        if FileVide then begin
          Result := false;
          Exit;
        end;
     
        Ch := Ptrfin^.Mot;
        Len := PtrFin^.len;
        Tmp := PtrFin;
        PtrFin := PtrFin^.Suivant;
        Dispose(Tmp);
        Result := true;
      end;
    var
      Tmp : string;
      Mot : string;
      len, i : integer;
    begin
      InitFile;
      Enfiler('', 3);
      while not FileVide do begin
        if not Defile(Mot, Len) then
          raise Exception.Create('Problem');
     
        for i := 0 to 25 do begin
          Memo1.Lines.Add(Mot + Chr(Ord('a') + i));
          if Len > 1 then begin
            Tmp := Mot + Chr(Ord('a') + i);
            Enfiler(Tmp, Len - 1);
          end;
        end;
      end;
      DeleteFile;
    end;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Algo] Trouver un arrangement ou une combinaison d'éléments
    Par Morvan Mikael dans le forum Algorithmes et structures de données
    Réponses: 16
    Dernier message: 20/04/2013, 11h46
  2. Algo d'arrangement (style quicksort)
    Par haribooo dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 31/08/2009, 01h14
  3. Optimisation algo permutations éléments d'1 ensemble
    Par User dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 23/10/2005, 18h29
  4. Cherche l'algo crc 16 bits
    Par icepower dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 21/08/2002, 13h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo