Ranger des mots par ordre alphabétique

Soyez le premier à donner votre avis sur cette source.

Snippet vu 16 636 fois - Téléchargée 27 fois

Contenu du snippet

Ce code permet de classer des mots par ordre alphabétique
C'estune astuce qui montre en gros comment fonctionne le rangement des fenetre utilisateur en mode +S ou les list avec l'option sort

Fait exactement le meme boulot que $sorttok mais ce code permet de voir comment ça marche et surtout il montre un bel exemple d'utilisation des hash table
C'est une astuce qui peut servir dans de nombreux codes quand on veut notament implémenter deux while pour comparer un mot a une liste de mot ...

Source / Exemple :


alias -l asc1 { if (!$1) { return 0 } | else { return $asc($1) } }
alias -l m { if ( $1 >= $2 ) { return $1 } | else { return $2 } }
alias -l compare {
  set %itr 1 
  while ( %itr <= $m($len($1),$len($2)) ) {
    if ( $asc1($mid($1,%itr,1)) > $asc1($mid($2,%itr,1)) ) { return $2 | goto fin }
    elseif ( $asc1($mid($1,%itr,1)) < $asc1($mid($2,%itr,1)) ) { return $1 | goto fin }
    elseif ( $asc1($mid($1,%itr,1)) = $asc1($mid($2,%itr,1)) ) { inc %itr }
  }
  if ( %itr = $calc($m($len($1),$len($2)) +1) ) { return $1 }
  :fin
}

alias trier { 
  var %resultat = $gettok($1-,1,32) z
  var %i1 = 2
  while ( %i1 <= $gettok($1-,0,32) ) {
    var %i2 = 1
    while ( %i2 <= $gettok(%resultat,0,32) ) {
      if ( $compare($gettok($1-,%i1,32),$gettok(%resultat,%i2,32)) = $gettok($1-,%i1,32) ) { 
        %resultat = $instok(%resultat,$gettok($1-,%i1,32),%i2,32) | %i2 = $gettok(%resultat,0,32)
      }
      inc %i2
    }
    inc %i1
  }
  return $gettok(%resultat,1- $+ $calc($gettok(%resultat,0,32) -1),32)
}

alias trier2 { 
  if ( $hget(ordre).size ) { hfree ordre }
  hadd -m ordre resultat $gettok($1-,1,32) z
  hadd -m ordre i1 2
  while ( $hget(ordre,i1) <= $gettok($1-,0,32) ) {
    hadd -m ordre i2 1
    while ( $hget(ordre,i2) <= $gettok($hget(ordre,resultat),0,32) ) {
      if ( $compare($gettok($1-,$hget(ordre,i1),32),$gettok($hget(ordre,resultat),$hget(ordre,i2),32)) = $gettok($1-,$hget(ordre,i1),32) ) { 
        hadd -m ordre resultat $instok($hget(ordre,resultat),$gettok($1-,$hget(ordre,i1),32),$hget(ordre,i2),32) 
        hadd -m ordre i2 $gettok($hget(ordre,resultat),0,32)
      }
      hinc ordre i2
    }
    hinc ordre i1
  }
  return $gettok($hget(ordre,resultat),1- $+ $calc($gettok($hget(ordre,resultat),0,32) -1),32)
}

Conclusion :


pour mettre par ordre alphabétique faire :
$trier(mot1 mot2 ... motN) ou
$trier2(mot1 mot2 ... motN)

ya un petit problème quand la chaîne de caractère est constitué par des chiffres.. je vous laisse le découvrir. Avec les mots ça marche impeccablement

Merci a Sorn_Drixer pour l'idée

A voir également

Ajouter un commentaire Commentaires
Kerrigan Messages postés 708 Date d'inscription lundi 15 juillet 2002 Statut Membre Dernière intervention 17 mars 2005
26 févr. 2004 à 15:42
avec la version hastable il n'y a pas de problème de set line too long et la rapidité reste pour des longues chaînes de caractère

par contre elle est plus lente de 4 milisecondes par rapport a la version en variable locale pour les chaînes de caractères de taille intermédiaire
darkyojimbo2 Messages postés 244 Date d'inscription mercredi 11 juin 2003 Statut Membre Dernière intervention 25 juin 2005
26 févr. 2004 à 16:44
Pour les chiffre les problemes c'est :

//echo -a $trier(4,333,222) qui retourne 222 333 4.
mais bon c'est normal ça. Vu que pour mirc le 2 est avant le 4.
C'est pour ce que les machines remplaceront jamais les hommes :p !

Je trouve que c'est original, ca m'a fait un bon exercice de lecture pour progresser dans les hash tables, j'ai mis un moment avant de comprendre le code.
J'ai eu plus de facilité à comprendre le code en hash tables qu'en variables classiques. Bizzare ?

J'ai une question :
Comment vous faites pour calculer le temps d'exectution ?
hier j'ai essaye en métant un grand nombre dans mon alias et apres j'ai chronometrer avec une montre :p. je pense pas que c'est la bonne solution. lol

pas tres utile mais mIRC ne sert pas qu'a chatter ! donc quand meme 10/10
Kerrigan Messages postés 708 Date d'inscription lundi 15 juillet 2002 Statut Membre Dernière intervention 17 mars 2005
26 févr. 2004 à 16:50
avec un truc de ce style

alias chrono {
var %ticks = $ticks
$1-
echo -s éffectué en $calc($ticks - %ticks) millisecondes
}

et tu fais /chrono commade
je crois que c'est ça
Sinon je met directement la premiere ligne et le la derniere dans mon code.
cs_SornDrixer Messages postés 2084 Date d'inscription jeudi 12 décembre 2002 Statut Membre Dernière intervention 30 janvier 2011 8
26 févr. 2004 à 19:22
Je trouve personnellement que la version en variable est plus compréhensible que la version en hashtable.

Beau boulot en tout cas :)
10/10
ChAnG-Fu Messages postés 165 Date d'inscription dimanche 2 novembre 2003 Statut Membre Dernière intervention 1 juillet 2006
26 févr. 2004 à 20:56
je prefere la hash table c'est clair qu'elle peut rebuter maisje la trouve plus stylée ... moins classique aussi

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.