Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SYSTÈME DE TRI DE DONNÉE AVEC @WINDOW AFIN D'ÉTABLIR UN CLASSEMENT.


Information sur la source

Catégorie :AddOns Classé sous : classement, tri, quizz Niveau : Débutant Date de création : 17/08/2007 Date de mise à jour : 19/08/2007 01:31:18 Vu : 1 532

Note :
Aucune note

Commentaire sur cette source (14)
Ajouter un commentaire et/ou une note

Description

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

  • 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-
  • }
  • }
  • }
  • }
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à :)
 

Historique

17 août 2007 11:56:58 :
Correction de fautes d'ortho :/
17 août 2007 14:35:30 :
Suppression d'une var inutile :)
18 août 2007 11:28:03 :
J'ai volontairement changé le nom de l'alias suite aux dernières modifs. - $points(table,1).hash va retourner le premier du classement si le classement est géré par hash - $points(table,1).ini va retourner le premier du classement si le classement est géré par ini - /points hash table pseudo nbre_de_pts va incrémenter le score de "pseudo" (classement géré par hash) - /points ini fichier.ini Section Pseudo nbre_de_pts va incrémenter le score de "pseudo" (classement géré par ini) Ne gère pour le moment pas les égalités. (J'ai volontairement pas commenté la partie "tri du fichier.ini" car quasiment identique à la partie "tri hash")
19 août 2007 01:31:18 :
Correction d'un bug suite à une erreur (utilisation de $2 au lieu de $3) optimisation du code avec utilisation de $v1

Commentaires et avis

signaler à un administrateur
Commentaire de RCA ArKanis le 17/08/2007 15:20:21

Tu devrais préciser qu'il s'agit d'un code à mettre dans la partie aliases et non remote.

Si j'ai bien compris, la table doit être construite comme ceci :
/hadd -m TABLE nick score
Tu devrais le préciser, ça pourrait profiter aux débutants ^^

$+($str(0,$calc(5 - $len(%donnees))),%donnees,$chr(32),%item)
devient :
$base(%donnees,10,10,5) %item

les /halt que tu utilises sont-ils vraiment nécessaires ? Il n'aurait pas plutôt fallu mettre plus simplement des /return ?

sinon c'est relativement bien codé et c'est commenté donc bon boulot ^^

tu pourrais utiliser le mode de fonctionnement en $isid et en commande, ça pourrait être pratique pour ajouter un score par exemple. En tout cas pour le moment, si on tape /tri table pseudo, rien ne se passe.

signaler à un administrateur
Commentaire de Anatolei le 17/08/2007 20:38:09

Tout d'abord merci pour ces précisions.
    J'ai fait les remplacements pour les halt, ainsi que pour le $base que j'avoue ne pas avoir utilisé avant ajourd'hui (et c'est en effet bien plus propre que ce que j'avais fait).
    Par contre je ne poste pas les modifs de suite, car je compte modifier ce code afin de le rendre bien plus complet, car dans l'état actuel il ne sert pas à grand monde, il faut l'avouer.
    Donc à venir niveau modifs:
- Possibilité d'utilisation en commande.
- Possibilité d'ajouter des points à un nick.
- Possibilité d'enlever des points à un nick, ou supprimer son score.
- Possibilité d'écraser les scores.
- Offrir le choix d'écrire les scores dans une talbe ou un ini.
- D'autres choses qui me viendront sûrement :-]

Anatolei.

signaler à un administrateur
Commentaire de wims le 17/08/2007 23:52:00

Bon j'avais écris un bon commentaire mais pour une raison vraiment conne, j'ai perdu le texte donc j'vais faire cours :

Déja je comprend pas pourquoi tu attendais "surtout" mon commentaires, j'suis pas la pour critiquer ouvertement :/ et je sais pas si la façon dont tu dis ça est gentille ou pas.

J'avais déja pensé a faire ça et j'avais déja réfléchi a la manière la meilleur pour faire ça (filter, @win, $sorttok..) avec Zerg (un modo de sdb j'sais pas si tu connais.) et bref le fait est que j'aurais plus vu l'alias trié directement la table (ça résoud le probleme qui fait que tu peux pas demandé un grand intervalle) selon sois les item/data ( ou / exprime "par rapport a) sois data/item ou alors par rappor a un item spécific uniquement ou la data contiendrait uniquement tout les pseudo avec leur score sous la forme pseudo-valeur (pas forcement pseudo dailleur) ou valeur-pseudo le tout séparé par un char (le char qui colle le pseudo et la valeur est aussi parametrable).

Ce n'est que mon avis !

Niveau code, c'est plutot bon tu peux supprimé les $calc lorsque tu set/Var une variable et que tu n'effectue qu'un seul calcul.
Tu devrais caché la fenetre aussi ça serait mieux
(je partage (l'avis) le commentaire d'ArKanis generalement, c'est encore la cas ici :p)

Voila donc en gros c'est une bonne idée, j'aime bien, reste que ça manque d'option et que c'est limité ;)

signaler à un administrateur
Commentaire de Anatolei le 18/08/2007 00:21:05

C'était plutot dit de manière gentille le "j'attends le commentaire de Wims" ^^

Je prends note de tes remarques, l'idée de cacher la fenêtre ne m'était pas venue, je vais faire en sorte que ça soit fait :-)
Concernant la manière de faire, j'avoue ne mettre pas vraiment penché sur le filter. La @win me paraît tout de même convainquante, j'ai fait un test sur 150 scores/pseudos et le tri s'était fait en 0,125s ce qui me paraît tout à fait acceptable :x
En tout cas pour les options, il me paraît évident que je ne vais pas laisser le code tel quel et faire en sorte de "pondre" un code complet sans trop tarder. Je vais déjà commencer par modifier avec vos remarques :)

signaler à un administrateur
Commentaire de wims le 18/08/2007 01:47:05

Bon j'avais écris un bon commentaire mais pour une raison vraiment conne, j'ai perdu le texte donc j'vais faire cours :

Déja je comprend pas pourquoi tu attendais "surtout" mon commentaires, j'suis pas la pour critiquer ouvertement :/ et je sais pas si la façon dont tu dis ça est gentille ou pas.

J'avais déja pensé a faire ça et j'avais déja réfléchi a la manière la meilleur pour faire ça (filter, @win, $sorttok..) avec Zerg (un modo de sdb j'sais pas si tu connais.) et bref le fait est que j'aurais plus vu l'alias trié directement la table (ça résoud le probleme qui fait que tu peux pas demandé un grand intervalle) selon sois les item/data ( ou / exprime "par rapport a) sois data/item ou alors par rappor a un item spécific uniquement ou la data contiendrait uniquement tout les pseudo avec leur score sous la forme pseudo-valeur (pas forcement pseudo dailleur) ou valeur-pseudo le tout séparé par un char (le char qui colle le pseudo et la valeur est aussi parametrable).

Ce n'est que mon avis !

Niveau code, c'est plutot bon tu peux supprimé les $calc lorsque tu set/Var une variable et que tu n'effectue qu'un seul calcul.
Tu devrais caché la fenetre aussi ça serait mieux
(je partage (l'avis) le commentaire d'ArKanis generalement, c'est encore la cas ici :p)

Voila donc en gros c'est une bonne idée, j'aime bien, reste que ça manque d'option et que c'est limité ;)

signaler à un administrateur
Commentaire de wims le 18/08/2007 01:52:52

ah ah dsl pour ce repost , j'avais mis précédent et j'suis partis; en revenant j'ai cru ne pas avoir envoyé le truc donc j'ai renvoyé.

Personnelement j'aimerais bien voir l'alias comme je l'ai dis plus haut, il serais pratique et utile, géré les ex-eco serait une bonne chose aussi

signaler à un administrateur
Commentaire de RCA ArKanis le 18/08/2007 02:10:48

Traducteur officiel de Wims, toujours présent !

* Personnelement :
Orthographe suggérée : Personnellement


* ex-eco :
Sachant que ex = "en dehors de" et eco = "écologie, économie, économe, ..."

ex-eco : un code qui sort de l'ordinaire en n'utilisant que peu d'électricité et donc qui contribue à la santé de la terre.


Orthographe (très largement) suggérée : ex aequo

* ex aequo :
deux personnes qui ont fait le même score

Bref, moi aussi je suis d'accord avec ce cher Wims :)

signaler à un administrateur
Commentaire de wims le 18/08/2007 04:37:14

Oué en ce moment je post beaucoup donc je pense pas tjs a vérifié l'orthographe dsl :]

signaler à un administrateur
Commentaire de ISoKa le 18/08/2007 07:14:16

VerifieR

/me sort

signaler à un administrateur
Commentaire de Anatolei le 21/08/2007 09:02:28

Il y a un pb, les dernières modifs de mon code n'apparaissent pas tout le temps :/

signaler à un administrateur
Commentaire de Renfield le 21/08/2007 09:26:43 administrateur CS

[F5]

signaler à un administrateur
Commentaire de wims le 21/08/2007 12:40:27

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 ;)

signaler à un administrateur
Commentaire de ISoKa le 21/08/2007 15:38:29

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

signaler à un administrateur
Commentaire de Anatolei le 22/08/2007 11:29:17

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

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

tri d'une page html..????? [ par Bouzoul ] Salut je debute dans le codage irc et je n'arrive pas a faire une parti de code, donc je fais appel a vos lumieres plzzzzzzzzz lol!donc voila je voudr bot quizz [ par bbjulien ] salutje chercher un bot quizz qui peut faire plusieur quizz:1 avec des question générale1 avec '' " sur les jeux vidéoet d autre encorej probléme irc :) aidez moi [ par Mordikuss ] oila je suis en train de me faire un bot sur irc et je l'ai pas terminé , sur se bot il y a une fonction quizz et une fonction bot qui modére le salon ou peut on trouver un bot quizz [ par staria ] je vx un bot quizz ss faute et complet on je px en trouver bouhhhh j'arrive po a trouver staria ingore pour quizz [ par maaars ] coucou je voudrai savoir comment faire pour que lorsque qu'un chatteur tape "vrai" ou "faux" a une question il sois ignoré pendant 10 secondes (afin d CreaTion d'un QUizz (Simple) [ par karukeranet ] Bonjour A tous Les ScripteursApres Avoir recopier Des Questions / Reponses Sur un Bloc Note (question.txt) Je voudrai savoir COmment creer un Script Q Comment faire un quizz avec des commandes de base [ par Bal007 ] Bonjour tout le monde,Je suis une personne utilisant régulièrement IRC, et je voudrais me créer un "Quizz". (Un eggdrop admettons où j'insère des que Comment avoir un chrono comme sur les quizz ... [ par Panther007 ] J'aimerais savoir comment faire pour que quand quelqu'un est une bonne réponse sa lui dise : Bravo $nick , tu à répondu en ... secondes et tu gagne .. Classement des trois meilleur joueur... [ par Panther007 ] Salut , J'ai un Jeu , Le But du jeu est de retapez le mot donner par le robot le plus vite possible , le premier qui tape le mot gagne , mais ce que j Le salon #sept_mn_d`intelligence sur le Serveur Voila\Wanadoo [ par LiGhT_At_ThE_EnD ] Coucou à tousJe vous invite à venir sur #sept_mn_d`intelligence où se trouve un robot de quizz particulier et une ambiance sympathiqueVous pouvez chat


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,593 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.