Autorisation : Membre
Nb de messages : 3767
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Ven 06 Jan 2012, 20:22
En Septembre 2011 j'ai participé à un petit concours d'optimisation dans lequel je me suis surpassé.
Je l'ai mentionné vite-fait dans un autre sujet de ce forum et Sangohan38 a désiré comparer nos morpions.
Ce programme est moche à voir alors les maniaques de l'écran graphique passez votre chemin
C'est son optimisation qui peut avoir de l'intérêt.
445 octets
Code
//Ý est le symbole cube comme ^3
//ü représente sto->
ClrHome
DelVar [A]{3,3üdim([A]
1üJ
DelVar A
For(W,2,6,2
For(V,2,6,2
Output(W,V,"?
End
End
2üX
2üY
Output(3,4,"*
Lbl 1
"OüStr1
If J=2
"XüStr1
Output(2,13,"J="+Str1
Repeat K
getKeyüK
End
Output(2Y-1,2X," "
min(3,max(1,X-(K=24)+(K=26üX
min(3,max(1,Y-(K=25)+(K=34üY
Output(2Y-1,2X,"*
If K-21 or [A](Y,X
Goto 1
Jü[A](Y,X
Output(2Y,2X,Str1
A+1üA
If A=9
Goto Z
[A](Y,1)[A](Y,2)[A](Y,3)-JÝ and [A](1,X)[A](2,X)[A](3,X)-JÝ and [A](1,1)[A](2,2)[A](3,3)-JÝ and [A](1,3)[A](2,2)[A](3,1)-JÝüB
3-JüJ
If B
Goto 1
Lbl Z
Output(7,1,"TERMINE
If B
Then
Output(8,1,"MATCH NUL
Else
If J-1:Output(8,1,"ROND GAGNE
If J-2:Output(8,1,"CROIX GAGNE
End
J'ai déjà une piste pour peut-être l'améliorer encore un petit peu : utiliser neuf touches du clavier pour les cases, plutôt qu'un curseur.
Au tour de Sangohan38 maintenant .
---------------------- ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)
Autorisation : Membre
Nb de messages : 3370
Inscrit le : Sam 31 Déc 2005, 19:48
Posté le : Sam 07 Jan 2012, 1:48
Voici le miens copier/coller de ti-graph link donc avec les symboles modifiés:
Code
EffEcr
EffListe L
9üdim(L
1üA
Disp "+-+-+-+","! ! ! !","+-+-+-+","! ! ! !","+-+-+-+","! ! ! !","+-+-+-+"
Lbl 1
0üK
codeTouch(üK
partEnt(K/10-6)üY
10partD–c(.1K)-1üX
If X<1 ou X>3 ou Y<1 ou Y>3:Goto 1
If A=1:Output(2Y,2X,"X
If A=ú1:Output(2Y,2X,"O úAüA
AüL(3(Y-1)+X
If abs(L(1)+L(2)+L(3))ø3 et abs(L(4)+L(5)+L(6))ø3 et abs(L(7)+L(8)+L(9))ø3 et abs(L(1)+L(4)+L(7))ø3 et abs(L(2)+L(5)+L(8))ø3 et abs(L(3)+L(6)+L(9))ø3 et abs(L(1)+L(5)+L(9))ø3 et abs(L(3)+L(5)+L(7))ø3:Goto 1
If A=ú1
1üB
If A=1
2üB
Output(8,1,"JOUEUR GAGNE!"
Output(8,8,B
Pause
EffEcr
Output(1,1,"
De mémoire, il y a quelques conditions incomplètes comme la vérification du remplissage de la case ou bien les touches hors pavé qui font changer de joueur (à vérifier ceci-dit).
Autorisation : Membre
Nb de messages : 3370
Inscrit le : Sam 31 Déc 2005, 19:48
Posté le : Sam 07 Jan 2012, 2:22
Comme je me suis refait mon programme à l'instant par une illumination en cette belle nuit étoilée, voici le nouveau code (je laisse l'ancien et supprime mes edits car le post devenait vraiment long.)
Code
EffEcr
EffListe L
9üdim(L
1üA
Disp "+-+-+-+","! ! ! !","+-+-+-+","! ! ! !","+-+-+-+","! ! ! !","+-+-+-+"
Lbl 1
0üK
codeTouch(üK
partEnt(.1K-6)üY
10partD–c(.1K)-1üX
If X<1 ou X>3 ou Y<1 ou Y>3 ou 1=abs(X+L(3(Y-1
Goto 1
If A=1:Output(2Y,2X,"X
If A=ú1:Output(2Y,2X,"O úAüA
AüL(X+3(Y-1
If 1ø(abs(L(1)L(2)L(3))abs(L(4)L(5)L(6))abs(L(7)L(8)L(9))abs(L(1)L(4)L(7))
abs(L(2)L(5)L(8))abs(L(3)L(6)L(9))abs(L(1)L(5)L(9))abs(L(3)L(5)L(7
Goto 1
abs(A)+(A=1->B
Output(8,1,"JOUEUR GAGNE!"
Output(8,8,B
Pause
EffEcr
Output(1,1,"
Manque plus que le match nul et je pense avoir tout résolu les soucis.
J'ai jamais réussi à comprendre ce genre de code ... t'peux m'expliquer pliiiz ?
A Sango :
Citer
0üK
codeTouch(üK
Est-ce que ça pourrait être remplacé par EffVar KcodeTouch(üK ?
Citer
partEnt(.1K-6)üY
Il y a une parenthèse en trop non ^^' ?
A Linka et Sango : en tous cas "beaux" programmes à tous les deux ... très bien optimisés
---------------------- La la la ...
Avez-vous pensé à regarder le manuel avant de demander conseil ? Un manuel est fait avant tout pour être consulté : MANUEL
Un problème de programmation ? Allez consulter ce tutoriel crée pour cela : TUTORIEL PROGRAMMATION
Vous avez un problème avec l'ordinateur avec votre calculatrice ? SOLUTIONEN VIDEO
J'ai jamais réussi à comprendre ce genre de code ... t'peux m'expliquer pliiiz ?
pour commencer, X-(K=24)+(K=26 signifie que si on appuie sur gauche, on soustrait 1 à X, et que si on appuye à droite, en ajoute 1 : on modifie les coordonnées.
Mais le problème avec ce sistème de déplacement très optimié, est qu'il ne tien pas compte du fait qu'on sorte de l'écran : le max(1,X-(K=24)+(K=26 signifie donc que si la nouvelle position est hors de l'écran du coté gauche (X vaut 0), dans ce cas on prend 1 à la place : on ne sort pas de l'écran.
Enfin le : min(3,max(1,X-(K=24)+(K=26 fait que la même chose ce face aussi à droite
Pour la seconde ligne, c'est la même chose sauf que c'est pour les positions verticales.
Citer
A Sango :
Citer
0üK
codeTouch(üK
Est-ce que ça pourrait être remplacé par EffVar KcodeTouch(üK ?
Citer
partEnt(.1K-6)üY
Il y a une parenthèse en trop non ^^' ?
Oui et oui
Sandro
---------------------- mort à l'inutile, place à la mémoire libre et aux programmes
Autorisation : Membre
Nb de messages : 3370
Inscrit le : Sam 31 Déc 2005, 19:48
Posté le : Sam 07 Jan 2012, 19:39
On ne peux être parfait donc ça me fait encore 2 octets d'économisés.
Au final, je pense prendre moins d'espace avec mon programme qu'avec celui de Linkakro.
Reste plus que l'égalité à prendre en compte mais j'ai ma petite idée et je vous modifies ça.
Autorisation : Membre
Nb de messages : 3767
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Dim 08 Jan 2012, 22:01
Merci beaucoup sandro pour avoir expliqué tout ça.
Je confirme que le DelVar sert à avoir Une matrice remplie de zéros.
Je fais souvent des truc améliorés quand je me replonge dans mes bricolage quelques mois après.
397 octets !!! testé sous vti
Code
ClrHome
DelVar [A]{3,3->dim([A]
DelVar A1->J // -1 chti octet // 2->J marche aussi...
For(W,2,6,2 // j'ai vérifié que c'est mieux que output
For(V,2,6,2
Output(W,V,"?
End
End
2->X
2->Y
Output(3,4,"*
Repeat A=9 or [A](Y,1)[A](Y,2)[A](Y,3)=J^3 or [A](1,X)[A](2,X)[A](3,X)=J^3 or [A](1,1)[A](2,2)[A](3,3)=J^3 or [A](1,3)[A](2,2)[A](3,1)=J^3
3-J->J // déplacé
"O->Str1
If J=2 // J-1 marche aussi...
"X->Str1
Output(2,13,"J="+Str1
Repeat K=21 and not([A](Y,X // aucun avantage/inconvénient excepté la rigeur
Repeat K
getKey->K
End
Output(2Y-1,2X," "
min(3,max(1,X-(K=24)+(K=26->X
min(3,max(1,Y-(K=25)+(K=34->Y
Output(2Y-1,2X,"*
End ////
J->[A](Y,X
Output(2Y,2X,Str1
A+1->A
End // grosse suppression
Output(7,1,"TERMINE
Output(8,1,Str1+" GAGNE // modif moins jolie mais tellement plus courte...
If A=9
Output(8,1,"MATCH NUL
J'ai retiré la manipulation bizarre du "->B" et déplacé le 3-J->J et utilisé une boucle.
J'ai cherché comment utiliser des touches plutôt qu'un curseur mais un de ces problèmes survient :
-soit j'augmente considérablement la procédure liée au getKey
-soit je ruine tout l'intérêt de ma principale ligne de test
Plus tard je chercherai quoi modifier dans le prog de sango sans remplacer ses listes par des matrices. J'en profiterai pour mesurer son poids.
EDIT 11/10/13: c'est parti pour que je ne le fasse jamais.
---------------------- ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)
Autorisation : Membre
Nb de messages : 3767
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Ven 11 Oct 2013, 20:14
Ben... un forum est moins strict qu'une lettre, mais la politesse ne fait que du bien.
Je redoute surtout les questions systématiquement posées à propos de syntaxe élémentaire et destraductions qui se trouvent dans ma signature.
---------------------- ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)