Ranger des mots par ordre alphabétique

Soyez le premier à donner votre avis sur cette source.

Snippet vu 16 164 fois - Téléchargée 25 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

hisoka2501
Messages postés
266
Date d'inscription
lundi 19 mai 2003
Statut
Membre
Dernière intervention
7 juillet 2009

a la place de goto fin
et de :fin

"break"

( je fais la chasse aux goto)

break stope la boucle en court et poursuit le script en cour :)


a part ca exelent alias, bravo ;)
cs_PaDa
Messages postés
1804
Date d'inscription
mardi 15 juillet 2003
Statut
Membre
Dernière intervention
22 septembre 2009
3
je fais une seule comparaison a chaque appel de /compare au lieu d'en faire plein de successives ... a ma connaissance c un des trucs qui prend du temps enfin bon ... et après avoir réfléchi je sais pas si c pas un coup de bol que ca prenne moins de temps ... dépend de la liste :/ moi chu sur d'la chimie orga et un peu de dynamique haut les coeurs courage a++
Kerrigan
Messages postés
708
Date d'inscription
lundi 15 juillet 2002
Statut
Membre
Dernière intervention
17 mars 2005

bon je vais voir comment tu vas traiter ça parce que j'ai pas bien capté le code ... faut dire que je dois réviser la thermo de sup ce soir... je crois que tu sais ce que c'est :(
cs_PaDa
Messages postés
1804
Date d'inscription
mardi 15 juillet 2003
Statut
Membre
Dernière intervention
22 septembre 2009
3
pas exactement pardon au détail des majuscules près ... enfin bon toi qui est en train de lire un de mes moments de solitudes ca te fait au moins 4 ou 5 facon de trier ... Maniaque ! bon allé j'lache mon pc pardon pour le pourrissage d'écran
cs_PaDa
Messages postés
1804
Date d'inscription
mardi 15 juillet 2003
Statut
Membre
Dernière intervention
22 septembre 2009
3
un autre truc me vient a l'esprit

1) passe ptet le $m du while en variable au début ... sur un tri de 40 mots (mot1 ... mot40) j'passe de 1432 a 1292 ms ... ok c pas fameux

2) sinon plutot que faire des tonnes de comparaisons , et la j'parle surtout pour les mots longs pourkoi ne pas aligner les codes ascii successifs et faire la comparaison seulement a la fin ? avec par exemple une astuce genre $right( $calc(1000 + $asc(gnagna)) ,3)pour avoir des codes de 3 lettres avec certitude ... et ce jusqu'a ce qu'un mot soit trop court genre ceci :

(ca fait pas le mm tri tout a fait pour les chiffres :
toi > mot10 mot1 mot11
moi > mot10 11 1 avec l'alias tel quel , 1 10 11 avec les deux lignes inhibeés en dessous ...)

alias -l compare {
var %i 1 , %len $iif($len($1) <= $len($2) , $len($1) , $len($2)) , %mot1 , %mot2
while (%i <= %len) {
%mot1 = %mot1 $+ $right($calc(1000 + $asc($mid($1,%i,1))),3)
%mot2 = %mot2 $+ $right($calc(1000 + $asc($mid($2,%i,1))),3)
inc %i
}
if (%mot1 <= %mot2) { return $1 } | else { return $2 }
;ou sinan :
;if (%mot1 == %mot2) return $iif($len($1) <= $len($2) , $1 , $2 )
;if (%mot1 < %mot2) { return $1 } | else { return $2 }
}

la je tourne a 820 ms pour 40 mots on y gagne un peu
la dernière solution (celle inhibée) est pas forcément super utile parce qu'elle réalise exactement le tri mirc en tout cas pour les mots commencant par une LETTRE :
alias -l compare { return $iif($1 <= $2 , $1 , $2) }
la 171 ms pour 40 mots lol
ensuite faut savoir ce qu'on veut faire des chiffres ...
bon allé vé bosser ++

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.