Mélanger un mot [Résolu]

Signaler
Messages postés
15
Date d'inscription
lundi 28 mars 2005
Statut
Membre
Dernière intervention
11 mai 2006
-
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
-
bonjour, pouvez vous me dire comment je peux mélanger les lettre dd'un mot svp?
merci

15 réponses

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
alors

@Florenth : AAAH NON! deja que t'es pas souvent la, internet en moins c'est pas marrant!!!!
ben a dans une semaine alors.
sinon oui on peu se refaire le concours des perf! ça m'a toujours eclater ... surtout que j'ai bien progresser depuis RomanUtils.

@imeys :

alors ma fonction, comme celle de florenth s'utilise de cette façon :

label1.caption := RandomizeString('Bonjour');

ce qui afficheras dans Label1 le mots "Bonjour" tout melanger.

function RandomizeString(const S : String) : string;
var X,                 { X sert a la boucle FOR pour effectuer un certain nombre de passage }
    L,                 { L sert a stocker la longeur de la chaine, en nombre de caracteres }
    I1, I2 : integer;  { I1 et I2 servent a stocker l'index des caracteres, ils sont definit
                         avec la fonction Random(L)+1 }
    C  : Char;         { C sert a sauvegarder le caractere a l'index I1 pour eviter de le perdre
                         quand on swap les caracteres de position I1 et I2 }
begin
  { on place la chaine S dans le resultat de la fonction, toutes les fonctions
    ont un retour qui est representé par la variable RESULT }
  Result  := S;

  { on sauvegarde la taille de la chaine dans L, la fonction Length permet de recuperer
    la longeur de beaucoup d'elements }
  L       := Length(S);

  { on init I2 aleatoirement, random genere un nombre aleatoire entre 0 et (L-1)
    tu peu t'interresser a la sources Bug Random de delphifr qui demontre un
    bug de cette fonction (L-1) }
  I2      := Random(L)+1;

  { on fait quelque passages, for est une boucle qui se traduit par :
    pour X de 1 a L faire ...
    La boucle for incremente (TO) ou decremente (DOWNTO) automatiquement la variable X }
  for X := 1 to L do begin

      { on genere une position aleatoire dans la chaine pour I1 }
      I1 := Random(L)+1;
     
      { pour eviter d'echanger la meme lettre, on control que les indexs I1 et I2
        soient differents. Avec une boucle conditionnelle WHILE DO qui peut se traduire par :
        Tant que (Condition) est vraie faire ... }
      while I2 = I1 do
         I2 := Random(L)+1;

   
      { ici on vas echanger la position de deux caracteres dans le mots. les deux caracteres
        seront choisis de maniere aleatoire grace aux valeur I1 et I2 }

      { on sauvegarde le caractere de position I1 dans C }
      C          := Result[I1];

      { on place le caractere de position I2 a la position I1 }
      Result[I1] := Result[I2];

      { enfin on place le caractere de position I1 (sauvegardé dans C) a la position I2 }
      Result[I2] := C;
  end; { fin de la boucle FOR }
end;
Messages postés
1725
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
11 avril 2021
8
Y'a pas sans doute pas grand chose qui change au niveau de l'utilisation que tu en fais, imeys.

Mais puisque nous avons une fonction (donc réutilisable dans d'autres applications), il s'agit avant tout d'en optimiser le code (surtout au niveau de la rapidité).

Il reste que le code de florenth, si tu fais bien attention, ne touche jamais au dernier caractère de ta chaîne, non ?

Bonne prog'
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
Tu écris simplement une fonction qui inverse aléatoirement deux lettres.
Per exemple

<hr size= "2" width="100%"> function MelangeMot(const M: string): string;
var
  I, Idx1, Idx2: Integer;
  Temp: Char;
begin
  Randomize;
  Result : = M;
  for I := 1 to Length(M) do
  begin
    Idx1 : = RandomRange(1, Length(M));
    Idx2 := RandomRange(1, Length(M));
    Temp := Result[Idx1];
    Result[Idx1] := Result[Idx2];
    Result[Idx2] := Temp;
  end;
end;
<hr size="2" width="100%">++

Si tu ne te plantes pas ......
tu ne pousseras jamais
Messages postés
15
Date d'inscription
lundi 28 mars 2005
Statut
Membre
Dernière intervention
11 mai 2006

ok merci je vais le tranformer suivant mon code et voir si cela fonctionne.
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
Normalement cette fonction est directement utilisable.
Tu n'as qu'a faire un copier-coller jusqu'a ton unité (au tout début de la partie 'implementation') et tu peux t'en servir partout dans ton unité.

Je pense que tu le savias déjà mais je le reprécise au cas où car ta réponse me semble obscure.

Si tu ne te plantes pas ......
tu ne pousseras jamais
Messages postés
15
Date d'inscription
lundi 28 mars 2005
Statut
Membre
Dernière intervention
11 mai 2006

non je ne le savai pas, je pensais que je devais modifier les variable etant donnée que j'ai deja commencer mon code avec 5 mots différents.
Donc je pensais qu'il fallait l'ajuster par rapport au nom.
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
Dans ce cas, imeys, une petite révision s'impose :
Le guide Delphi

N'oublie pas d'ajouter "Math" dans la clause "uses". C'est une erreur fréquente.
Et n'oublie pas de cliquer sur "réponse acceptée" quand tu auras trouvé la réponse à ton problème.

++

Si tu ne te plantes pas ......
tu ne pousseras jamais
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
alternative pour les mots complets :

function RandomizeString(const S : String) : string;
var X,L,
    I1,I2 : integer;
    C     : Char;
begin
  Result  := S;

  { on sauvegarde la taille de la chaine }
  L       := Length(S);

  { on init I2 aleatoirement }
  I2      := Random(L)+1;

  { on fait quelque passages }
  for X := 1 to L do begin
      { on genere une position aleatoire dans la chaine pour I1 }
      I1 := Random(L)+1;
     
      { pour eviter d'echanger la meme lettre, on control que les indexs
        soient differents }
      while I2 = I1 do
         I2 := Random(L)+1;

      { on sauvegarde le caractere a la position I1 }
      C          := Result[I1];

      { on place le caractere de position I2 a la position I1 }
      Result[I1] := Result[I2];

      { enfin on place le caractere de position I1 a la position I2 }
      Result[I2] := C;
  end;
end;
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
Pardon f0xi mais quelle est la différence entre a méthode et la mienne, à part que l'on ne peut pas échanger deux foisle même caractère ??

En même temps, je pense qu'il faut admettre pouvoir inverser la même lettre, sinon les mots seraient tout le temps trop mélangés. Bon j'arrive pas trop à m'exprimer sur ce coup-ci mais j'espère que tu auras compris.

Eh, dis, si on faisait un concours de la fonction la plus performante ? ça fait un moment qu'on en a pas fait.
(par contre, dès ce soir, j'ai plus Internet pour une bonne semaine au mons - va falloir se dépécher)

++

Si tu ne te plantes pas ......
tu ne pousseras jamais
Messages postés
15
Date d'inscription
lundi 28 mars 2005
Statut
Membre
Dernière intervention
11 mai 2006

FOXI peut tu m'expliquer tes variable stp?

Pour voir  qu'elle variable est le mot.
Parce que aucun des deux ne fonctionne et jaimerai les modifier avec mes données en espérant qu'il tournera mais je ne comprend pas tes variable

merci
Messages postés
15
Date d'inscription
lundi 28 mars 2005
Statut
Membre
Dernière intervention
11 mai 2006

ah impec je m'excuse de t'avoir fait faire tout cela mais faut bien débuter un jour et au moins je peux le modifier par rapport a celui que j'ai déjà commencé.
Je te remercie et donc je cloture cette discussion vu qu'elle me convient amplement.

merci
Messages postés
1725
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
11 avril 2021
8
Les 2 méthodes sont effectivement très semblables.

Ce que je préfère dans l'approche à florenth :
- ben il a posté le premier, lol,
- la possibilité laissée qu'un char et lui même soient inversés, donc le string n'est pas mélangé cette fois là, après tout c'est le hasard...
- il n'a pas oublié d'initialiser avec Randomize, lui...

Ce que je préfère dans l'approche à fOxi :
- il ne recalcule pas à chaque fois la longueur du string,
- il utilise Random plutôt que RandomRange, non disponible sous D4, mais dont l'usage me paraît de toute manière superflu dans le contexte,
- il n'oublie pas d'ajouter +1 à Random(), comme il aurait fallu le faire avec RandomRange(), afin de ne pas oublier le dernier char, n'est-ce pas, florenth ?

Voilà, pour tout dire, ça m'avait inspiré ceci, qui est la synthèse de ce que je viens d'exprimer :

function RandomStr(const S: string): string;
var
i,
Pos1, Pos2,
L: Integer;
Tmp: Char;
begin
Randomize;
Result := S;
L := Length(S);
for i : = 1 to L do
begin
Pos1 := Random(L) + 1;
Pos2 := Random(L) + 1;
Tmp := Result[Pos1];
Result[Pos1] := Result[Pos2];
Result[Pos2] := Tmp;
end;
end;

En attendant que la connexion de florenth soit rétablie...

Bonne prog'
Messages postés
15
Date d'inscription
lundi 28 mars 2005
Statut
Membre
Dernière intervention
11 mai 2006

merci mais ca reviens au meme non?

je vois pas ce qu'il change
Messages postés
15
Date d'inscription
lundi 28 mars 2005
Statut
Membre
Dernière intervention
11 mai 2006

exact ben merci d'avoir modifier
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
He he, j'y pensais carrément plus au "bug" de RandomRange.
Mais, par contre, je ne recalcule pas à chaque fois la longueur de la chaine car Delphi, par son type 'string' réserve huit octets de mémoire supplémentaire par chaine pour stocker le nombre de caractères et le nombre d'occurences. Donc Length(S) n'est qu'un appel à une partie de la mémoire. C'est donc pas plus lent. Après, il y a peut être une différence (et il y en une) entre le temps d'acces à un registre et celui pour une partie de la mémoire ...

++

Si tu ne te plantes pas ......
tu ne pousseras jamais