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

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

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)