(À SUPPRIMER)

Signaler
Messages postés
340
Date d'inscription
dimanche 18 septembre 2005
Statut
Membre
Dernière intervention
22 octobre 2009
-
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/44491-a-supprimer

Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1
Je vois que tu n'écoutes pas trop les conseil qu'on te donne, et en plus tu as mis ton code a jour avec une erreur, au niveau du /while il manque un espace pour la condition
Messages postés
1
Date d'inscription
mercredi 2 janvier 2008
Statut
Membre
Dernière intervention
2 janvier 2008

super
Messages postés
340
Date d'inscription
dimanche 18 septembre 2005
Statut
Membre
Dernière intervention
22 octobre 2009

Merfi wims pour ces eclaircissements. A present, je comprendrais mieux lors de la lecture de certaines sources ^^.
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1
Le ! permet de retourné la forme non évalué d'un identifier/variable, du style :

//echo -a $!me $!!me
Combiné avec $() ( $eval() quoi ) :
//echo -a $($!!me,3)
;$me est la forme évalué 0 fois
;la valeur de $me est la formé évalué 1 fois ...
;$!me c'est -1
;donc là, $!!me c'est -2, on évalue 3 fois , -2 + 3 = 1 on retrouve bien la valeur de $me évalué une fois.

En gros dans le code, je stock la valeur non évalué de $read(text.txt) dans une variable parce que on va utiliser plusieur fois ce $read et la valeur doit etre actualisé a chaque fois qu'on l'utilise, si on mettais que $read(text.txt), la valeur serait tjs la même.J'utilise ensuite $(,2) pour actualisé a chaque coup :]
Messages postés
340
Date d'inscription
dimanche 18 septembre 2005
Statut
Membre
Dernière intervention
22 octobre 2009

Ah sacre wims !

+1 pour les techniques :)
Mais, comme tu me connais, je privilegierais la rapidite.
Par contre, je voudrais un peu d'explication sur cette syntaxe stp:

$!read(text.txt)

Je n'ai toujours pas capte le principe de mettre un '!' entre le $ et la commande. Quelles sont les applications les plus courantes de cette syntaxe ?

Merci

PS: Je dois m'excuser aupres de vous tous. Oui, je ne mets aucun accent aigue/grave/circonflexe ou autre cedille pour la simple et bonne raison que j'ai un foutu clavier qwerty et un pc qui refuse tout quand je veux modifier la langue. :(. Bref, maintenant vous savez lol. voila
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1
On *:Text:*:#:{
Var %a 1 ,%r $+($!read(text.txt),$chr(32))
While (%repeat <= 1000) {
var %m $str($(%r,2),$iif(!$r(0,1),1,$iif(!$r(0,4),3,2)))
var %p $+(/(,$replace(%m,$chr(32),$chr(124)),)/i)
If $regex($1-,%p) { Timermsg 1 $r(2,5) Msg $chan %m | Break }
Inc %repeat
}
var %w $+($iif($6,$5-6,$iif($4,$+($3-4,$crlf,$1-4),$iif($2,$1-2))))
Write text.txt %w
If (!$r(0,99)) Write text.txt $nick
}

C'est peut-être pas la meilleur optimisation car c'est surement plus long, et c'est un peu moche, mais ça montre des techniques a utiliser lorsque certaine action se ressemble un peu trop et qu'on ne sais pas comment amélioré ça :)
Messages postés
435
Date d'inscription
jeudi 27 avril 2006
Statut
Membre
Dernière intervention
17 octobre 2008

je disai virtuel pck c'est pas écri "break" par contre pour le bot, si on ve detect un mot de sa phrase présent dans le txt il serait peut etre interessant de ne detecter que les mots d'une longueur superieure ou egale à 3 ou 4 caracteres pour éviter le match sur le, la, du, de etc...
Messages postés
340
Date d'inscription
dimanche 18 septembre 2005
Statut
Membre
Dernière intervention
22 octobre 2009

Mea Culpa.

Tu avais raison isoka ;). Son code ne le fait pas 'virtuellement' mais bien concretement. Ah, le pouvoir du elseif ...

Soit, mon code devient donc:

On *:Text:*:#:{
Var %repeat = 0
While (%repeat <= 1000) {
If ($r(1,2) == 1) { Set %msg $read(text.txt) }
ElseIf ($r(1,5) == 1) { Set %msg $read(text.txt) $read(text.txt) $read(text.txt) }
Else { Set %msg $read(text.txt) $read(text.txt) }
If $regex($1-,/( $+ $replace(%msg,$chr(32),$chr(124)) $+ )/i) {
Timermsg 1 $r(2,5) Msg $chan %msg
;thx isoka ^^
Break
}
Inc %repeat
}
If $6 { Write text.txt $5 $6 }
ElseIf $4 {
Write text.txt $3 $4
Write text.txt $1 $2 $3 $4
}
ElseIf $2 { Write text.txt $1 $2 }
If ($r(1,100) == 5) { Write text.txt $nick }
UnSet %repeat
}
Messages postés
340
Date d'inscription
dimanche 18 septembre 2005
Statut
Membre
Dernière intervention
22 octobre 2009

J'ai remplace

set %repeat 0
:repeat
inc %repeat 1
if ( $rand(1,2) == 1 ) { set %msg $read(text.txt) }
elseif ( $rand(1,5) == 1 ) { set %msg $read(text.txt) $read(text.txt) $read(text.txt) }
else { set %msg $read(text.txt) $read(text.txt) }
if ( $1 isin %msg || $2 isin %msg || $3 isin %msg || $4 isin %msg || $5 isin %msg || $6 isin %msg ) { timermsg 1 $rand(2,5) msg $chan %msg }
elseif ( %repeat != 1000 ) { goto repeat }

par

While (%repeat <= 1000) {
If ($r(1,2) == 1) { Set %msg $read(text.txt) }
ElseIf ($r(1,5) == 1) { Set %msg $read(text.txt) $read(text.txt) $read(text.txt) }
Else { Set %msg $read(text.txt) $read(text.txt) }
If $regex($1-,/( $+ $replace(%msg,$chr(32),$chr(124)) $+ )/i) { Timermsg 1 $r(2,5) Msg $chan %msg }
Inc %repeat
}

Dans l'original, il rebouclera tant que %repeat n'est pas egal a 1000 avec un increment unitaire. C'est exactement ce que j'ai fait dans ma version. Donc je ne vois pas ou le code original fait le 'break' virtuellement. Si c'est le 'elseif' de la condition 'elseif ( %repeat != 1000 ) { goto repeat }' alors c'est ce qui m'a rendu perplexe (cf. mes precedents posts) car, il aurait du mettre un 'if'. Mais, quand bien meme il y a un 'elseif', le code rebouclera toujours jusqu'a ce que %repeat equivaut a 1000.
Messages postés
435
Date d'inscription
jeudi 27 avril 2006
Statut
Membre
Dernière intervention
17 octobre 2008

Tropnul en lisant le code que tu as fai je voi :
While (%repeat <= 1000) {
If ($r(1,2) == 1) { Set %msg $read(text.txt) }
ElseIf ($r(1,5) == 1) { Set %msg $read(text.txt) $read(text.txt) $read(text.txt) }
Else { Set %msg $read(text.txt) $read(text.txt) }
If $regex($1-,/( $+ $replace(%msg,$chr(32),$chr(124)) $+ )/i) { Timermsg 1 $r(2,5) Msg $chan %msg }
Inc %repeat
}

pense peut etre à break si ton regex match pck si jamais y a bcp d'occurences dans le txt tu vas excess flood je pense. le code original avec ses if et elseif break de facon virtuelle.
Messages postés
435
Date d'inscription
jeudi 27 avril 2006
Statut
Membre
Dernière intervention
17 octobre 2008

ha merde g raté tt l'effet à cause de cet oubli :/
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1
met un $+, ça marchera mieux (3e ligne)
Messages postés
435
Date d'inscription
jeudi 27 avril 2006
Statut
Membre
Dernière intervention
17 octobre 2008

surtout que
# write text.txt $1 $2
# else write text.txt $1 $2 $3 $4
# write text.txt $3 $4
# write text.txt $5 $6

devient
var %t $1-2
else var %t $+(%t,$crlf,$1-4)
var %t (%t,$crlf,$3-4,$crlf,$5-6)
write text.txt %t

ce que je prefere grandement perso (oui oui je suis un chieur et j'aime ca :) )
Messages postés
340
Date d'inscription
dimanche 18 septembre 2005
Statut
Membre
Dernière intervention
22 octobre 2009

Tant que j'y suis, je continue.

[REMARQUE1]
Il faudrait aussi que tu prevois un systeme de remise a zero ou de stockage efficace du fichier text.txt. En effet, sa taille ne cessera de s'agrandir avec le present code.
/REMARQUE1

[REMARQUE2]
Ce qu'isoka a fait ressortir n'est pas denue de sens. D'apres mes tests personnels d'il y a quelques temps, a partir de 7000 lignes dans un fichier txt et quand on n'utilise pas les moyens misent a diposition par mirc pour ce genre de cas, tu risques d'avoir des petits intervalles de 'freeze' de mirc. Mais c'est assez insignifiant si tu ne fais que trois write. Donc, dans le cas ou tu changerais la facon d'acceder a ce fichier ou alors si tu changes ton algorithme de recherche, et surtout, s'il t'arrives a inclure ne serait-ce qu'une seule boucle while, utilises le file handling ou des hash tables. Ce sera nettement mieux et aussi beau a voir :p.
/REMARQUE2

[REMARQUE3]
L'identifieur $rand peut etre remplace par $r.
/REMARQUE3

[REMARQUE4]
La condition

if ( $1 isin %msg || $2 isin %msg || $3 isin %msg || $4 isin %msg || $5 isin %msg || $6 isin %msg ) { timermsg 1 $rand(2,5) msg $chan %msg }

peut etre optimise par

if $regex($1-,/( $+ $replace(%msg,$chr(32),$chr(124)) $+ )/i) { timermsg 1 $r(2,5) msg $chan %msg }

alors, oui, j'ai change son fonctionnement pour faire en sorte de verifier tous les mots dits par $nick. je pense que c'est mieux. mais evidemment, tu peux remplacer $1- par $1-6.
/REMARQUE4

[REMARQUE5]
La methode dont tu as use pour le goto me laisse perplexe. Une boucle while serait plus 'propre' a mon avis.
Voila ce que je propose:

On *:Text:*:#:{
Var %repeat = 0
While (%repeat <= 1000) {
If ($r(1,2) == 1) { Set %msg $read(text.txt) }
ElseIf ($r(1,5) == 1) { Set %msg $read(text.txt) $read(text.txt) $read(text.txt) }
Else { Set %msg $read(text.txt) $read(text.txt) }
If $regex($1-,/( $+ $replace(%msg,$chr(32),$chr(124)) $+ )/i) { Timermsg 1 $r(2,5) Msg $chan %msg }
Inc %repeat
}
If $6 { Write text.txt $5 $6 }
ElseIf $4 {
Write text.txt $3 $4
Write text.txt $1 $2 $3 $4
}
ElseIf $2 { Write text.txt $1 $2 }
If ($r(1,100) == 5) { Write text.txt $nick }
UnSet %repeat
}
/REMARQUE5

Si j'ai d'autres remarques/propositions, je le ferais :)

Cordialement
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1
Il est vrai que faire des /writes signifie "ouvrir écrire et fermer le fichier" mais comme on dit, c'est de l'insolence de faire du file handling pour 3 write :)
Messages postés
340
Date d'inscription
dimanche 18 septembre 2005
Statut
Membre
Dernière intervention
22 octobre 2009

ERRATA:

[1]
...dans le cas ou le prochain temps du timermsg est superieur au temps du timermsg precedent...

a remplacer par:

...dans le cas ou le prochain temps du timermsg est inferieur au temps du timermsg precedent...

[2]
timerUn 1 5 echo -at je ne salue pas :p

a remplacer par:

timerUn 1 5 echo -at je ne te salue pas :p

^^
Messages postés
340
Date d'inscription
dimanche 18 septembre 2005
Statut
Membre
Dernière intervention
22 octobre 2009

as-tu fais des tests dans un salon 'reel' pour le timer nomme ?
je pense que cela n'aura pour effet que de reinitialiser le timermsg a chaque fois dans le cas ou le prochain temps du timermsg est superieur au temps du timermsg precedent. du coup, les timer se 'mangeront' a chaque fois que ce cas se presentera.
je ne peux affirmer ce que je dis car je n'ai pas les moyens de tester (pas de mirc installe sur le pc ou je suis) mais je maintiens toujours cette opinion.

simple exemple:

;
alias timermangelautre {
  timerUn 1 10 echo -at salut toi
  timerUn 1 5 echo -at je ne salue pas :p
}
;


pour l'alias ci-dessus, je m'attendrais a ne voir s'afficher que 'je ne te salue pas :p'.

au cas ou j'aurais tort, veuillez ignorer ce post. (honte a moi) mais ce n'est qu'un doute. donc, maintenant, a toi de tester. mets pleins d'echo pour voir et savoir si vraiment tous les timers lances son executes et qu'il n'y en aient pas qui sont reinitialises par les prochains.

cordialement
Messages postés
435
Date d'inscription
jeudi 27 avril 2006
Statut
Membre
Dernière intervention
17 octobre 2008

je démord pas que franchement le write en 3 fois c grave pas joli et optimal :) moi je voi sur des remotes que je fai quand j'ai trop de write en meme temps je le sent passer. pour ce qui est des htables bin suffit au lieu de write de faire hadd et ensuite pour la recherche un $find ou $hmatch et ca se fai gentiment.
Messages postés
13
Date d'inscription
samedi 24 février 2007
Statut
Membre
Dernière intervention
6 février 2008

TropNul : Pour le timer j'ai mit un "timermsg msg ...", comme ça un timer à la fois !

ISoKa : tu parle un if %msg isin $1- ? Comme ça tout le texte est prit ! Sinon pour les htable je vois pas comment faire pour savoir si un mot est dnas une table ...

wims : Merci de défendre mon super ordi :D
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1
Faire 3 write sur un on text ça va faire ramer mémée ? sur un de mes vieux pc 266mhz ouais, mais pas sur les pc d'aujourd'hui...

Sur un fichier de plus de 700 lignes, je met 0 ms (15 max) a écrire trois fois dans le fichier,et le pc sur lequel je fais ça est vraiment bof :)
Messages postés
435
Date d'inscription
jeudi 27 avril 2006
Statut
Membre
Dernière intervention
17 octobre 2008

Bonjour,

faire 3 write sur chaque on text ca va ramer sa mémée sur des gros chans. essai ptete de voir pour gerer ca autrement au moins file handling ou mieu htables.
ensuite, pourquoi se limiter au 6iem mot pour le test ?

ca pourrait etre bien optimiser je pense.
Messages postés
340
Date d'inscription
dimanche 18 septembre 2005
Statut
Membre
Dernière intervention
22 octobre 2009

lol, je suis sur que bon nombre de personnes tomberont dans le panneau et parleront a ce bot pendant un moment avant de se rendre compte du truc.

a l'etat ou est le code, il y subsiste une faille importante. a savoir que sur un salon avec plusieurs personnes, il y aura de fortes chances qu'il soit deconnecter en 'excess flood'. donc, a revoir le systeme de 'timer msg ...' (peut-etre dans une queue de messagerie).

a part ca, bon courage pour l'amelioration.