Système de tri de donnée avec @window afin d'établir un classement.

Soyez le premier à donner votre avis sur cette source.

Snippet vu 3 097 fois - Téléchargée 16 fois

Contenu du snippet

Système permettant le tri d'une hashtable avec utilisation d'une @window afin d'en faire ressortir un classement. Utilisable pour un jeu style quizz par exemple. Exemple d'utilisation : $tri(table,5) va retourner le pseudo en 5ème position ainsi que son score ; $tri(table,5-10) va retourner les mêmes choses mais de la 5ème position à la 10ème incluse.

Source / Exemple :


points {
  if $isid {
    if $prop == hash {
      ; on verifie l'existence d'une table et de l'argument $2 ;
      if !$hget($1) || !$2 { return }

      ; si la window est déjà ouverte, on la ferme ;
      ; puis on l'ouvre avec les options 'l10' pour ajouter une liste et 'S' qui permet de trier celle-ci ;
      if $window(@scores) { window -c @scores }
      window -hl10S @scores
      var %a = 1, %class

      ; On entre les données de la table dans la window en faisant une boucle sur la totalité des items de la table ;
      ; Afin d'éviter un bug dans le tri des scores, j'ajoute des '0' pour faire que la totalité des scores aient la même longueur ;
      ; Sans ça, 22 sera considéré comme plus important que 122 ;
      while $hget($1,%a).item {
        var %donnees = $hget($1,$v1), %item = $v1
        aline -l @scores $base(%donnees,10,10,5) %item
        inc %a
      }

      ; On regarde si l'arguement $2 demande une intervalle ;
      if $regex($2,/([0-9]+)-([0-9]+)/) {
        if $regml(1) >= $regml(2) || $regml(1) > %a || $regml(2) > %a { return }

        ; On définit la var %deb qui indique de quelle position nous devons partir et la var %fin la position ou l'on doit s'arrêter ;
        ; A savoir que la liste tri par ordre croissant, donc le score le plus petit se trouve en premier dans la liste et le plus grand en dernier ;
        var %deb = %a - $regml(1), %fin = %a - $regml(2)
        while %deb >= %fin {
          var %pseudo = $gettok($line(@scores,%deb,3),2,32), %score = $regsubex($gettok($line(@scores,%deb,3),1,32),/^0+/gi,)

          ; On stock les données dans la var %class sous forme 'pseudo=score pseudo=score' ;
          ; Attention à ne pas demander une intervalle trop grande, il faut penser que la var ne peut pas stocker de données trop importantes :/ ;
          var %class = $addtok(%class,$+(%pseudo,$chr(61),%score),32)
          dec %deb
        }
      }

      ; Si on demande simplement de retourner une position ;
      elseif $2 isnum && $2 <= %a {
        var %pseudo = $gettok($line(@scores,$calc(%a - $2),3),2,32), %score = $regsubex($gettok($line(@scores,$calc(%a - $2),3),1,32),/^0+/gi,)

        ; On stock les données dans la var %class sous forme 'pseudo=score' ;
        var %class = $+(%pseudo,$chr(61),%score)
      }

      ; On ferme la window ;
      window -c @scores

      ; On retourne les données demandées ;
      return %class
    }
    elseif $prop == ini {
      if !$ini($1,$2) { return }
      if $window(@scores) { window -c @scores }
      window -hl10S @scores
      var %a = 1, %class
      while $ini($1,$2,%a) {
        var %donnees = $readini($1,$2,$v1), %item = $v1
        aline -l @scores $base(%donnees,10,10,5) %item
        inc %a
      }
      if $regex($3,/([0-9]+)-([0-9]+)/) {
        if $regml(1) >= $regml(2) || $regml(1) > %a || $regml(2) > %a { return }
        var %deb = %a - $regml(1), %fin = %a - $regml(2)
        while %deb >= %fin {
          var %pseudo = $gettok($line(@scores,%deb,3),2,32), %score = $regsubex($gettok($line(@scores,%deb,3),1,32),/^0+/gi,)
          var %class = $addtok(%class,$+(%pseudo,$chr(61),%score),32)
          dec %deb
        }
      }
      elseif $3 isnum && $3 <= %a {
        var %pseudo = $gettok($line(@scores,$calc(%a - $3),3),2,32), %score = $regsubex($gettok($line(@scores,$calc(%a - $3),3),1,32),/^0+/gi,)
        var %class = $+(%pseudo,$chr(61),%score)
      }
      window -c @scores
      return %class
    }
  }
  else {
    ; Si j'utilise un system de hash ;
    if $1 == hash {
      ; J'incrémente l'item, le -m créé l'item s'il n'existe pas ;
      hinc -m $2-
    }
    ; Si j'utilise un system d'ini ;
    elseif $1 == ini {
      ; On regarde si l'item existe, on l'incrémente ;
      if $readini($2,$3,$4) {
        writeini $2-4 $calc($v1 + $5)
      }
      else {
        ; sinon on créé l'item ;
        writeini $2-
      }
    }
  }
}

Conclusion :


Pour le moment ne gère que les données "entassées" dans une table. Mais je vais voir pour gérer un .txt et un .ini pour laisser libre choix à l'utilisateur.

J'attends vos idées pour, pourquoi pas faire évoluer ce code. J'attends surtout le commentaire de Wims car il a forcément quelque chose à dire ^^
Si la source est ininteressante, effacez là :)

A voir également

Ajouter un commentaire

Commentaires

Anatolei
Messages postés
27
Date d'inscription
samedi 24 décembre 2005
Statut
Membre
Dernière intervention
31 janvier 2009
-
Pour le commentaire de Renfield, bravo tu sais te servir d'un clavier.
Ensuite, $point(name,N-M) fonctionne pour les hash/ini , je modifirais l'intro et les explications. En ce qui concerne le paramètre inv j'ai pas bien pigé l'utilité, mais je peux tout de même ajouter ça si ça peut être utile. Par contre je passe pour le triage de var, je propose déjà hash|ini ^^
Par contre j'avoue le fait de décrémenter j'allais le faire mais je suis parti faire autre chose et ça m'est sorti de la tête, je vais ajouter ça :)
Concernant le post d'ISoKa, bonne idée, j'vais ajouter ça aussi :)
Merci de vos commentaires en tout cas
cs_ISoKa
Messages postés
437
Date d'inscription
jeudi 27 avril 2006
Statut
Membre
Dernière intervention
17 octobre 2008
-
Bonjour,

Une option qui pourrai servir à certains ca serai de pouvoir avoir un truc genre $point(nom,N-M).score renvoyant toute les personnes ayant un score compri entre N et M
cs_wims
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1 -
Je prefère déja largement l'alias sous cette forme !
Pense a édité l'intro de ta source tu parles encore de $tri.

Bon donc c'est beaucoup mieux comme ça mais tu devrais bien précisé certains truc :
$point(name,N-M)
propriété : .ini .hash
N-M marche pour les .ini ?

Tu devrais maintenant géré les cas ou ce que l'on veux trié se fait dans l'autre sens, car la ton code ne fait que trié sous cette forme :

table item data

data est la valeur selon laquelle le tri est effectué
mais il est possible que pour certaine raison, ce sois l'item qui contienne ce par rapport a quoi on veut trié, donc tu pourrais rajouté un parametre inv, qui permettrais cela (par defaut, sans parametre inv donc, le tri serait normal)

Cette dernière remarque s'applique aussi pour les fichiers .ini

Tu pourrais aussi trié des variables (là aussi il y a deux cas)
Soit la variable se présente sous cette forme :

%var item1-data1 item2-data2

et dans ce cas on apellerait l'alias comme cela : $point(var,N-M,32,45).var
ou 32 représente le char ascii qui sépare les formes item/data entre eux, et 45 qui sépare reelement item/data (j'sais pas si tu vas comprendre) avec la possibilité bien sur d'inversé (data-item) avec le ,inv en dernier parametre.

ou alors il y a plusieur variables sous cette forme là :
%var.item1 data1
%var.item2 data2
etc..

ou là encore les deux methode avec le ,inv sont possible.

Pour ce qui est de l'appel de l'alias en command pour incrémenté une valeur, on ne peut pas décrémenté :) ?

Voila, sinon bien joué, c'est utile ;)
Renfield
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57 -
[F5]
Anatolei
Messages postés
27
Date d'inscription
samedi 24 décembre 2005
Statut
Membre
Dernière intervention
31 janvier 2009
-
Il y a un pb, les dernières modifs de mon code n'apparaissent pas tout le temps :/

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.

Du même auteur (Anatolei)