Poster un nouveau sujet Poster une réponse
défi d'optimisation de morpion
Auteur Message
linkakro



Autorisation : Membre
Nb de messages : 3767
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Ven 06 Jan 2012, 20:22   Citer 

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 godgrace.gif
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 clown.gif.

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

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
Sangohan38



Autorisation : Membre
Nb de messages : 3370
Inscrit le : Sam 31 Déc 2005, 19:48
Posté le : Sam 07 Jan 2012, 1:48   Citer 

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

Sangohan38

 Adresse email Haut de page Bas de page 
 
Sangohan38



Autorisation : Membre
Nb de messages : 3370
Inscrit le : Sam 31 Déc 2005, 19:48
Posté le : Sam 07 Jan 2012, 2:22   Citer 

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.

Sangohan38

 Adresse email Haut de page Bas de page 
 
The K



Autorisation : Membre
Nb de messages : 878
Inscrit le : Sam 15 Oct 2011, 11:07
Posté le : Sam 07 Jan 2012, 11:19   Citer 

Bon euh ... j'ai deux ou trois petites questions / suggestions ...

A Linka :


Citer
DelVar [A]{3,3üdim([A]


Le DelVar[A] sert-il ?


Citer
min(3,max(1,X-(K=24)+(K=26üX
min(3,max(1,Y-(K=25)+(K=34üY


J'ai jamais réussi à comprendre ce genre de code ... t'peux m'expliquer pliiiz ? minied.gif

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 winkle.gif

----------------------
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 ? SOLUTION EN VIDEO

Mes programmes sur le site : Produit scalaire KMorpion Puissance 4 Mastermind

Mes nouveaux programmes de calcul formel : FCarré FPrime

Projet base de données : ici mais abandonné. Trop de travail ...
 Adresse email Haut de page Bas de page 
 
Persalteas



Autorisation : Membre
Nb de messages : 2164
Inscrit le : Sam 23 Jan 2010, 20:09
Posté le : Sam 07 Jan 2012, 11:52   Citer 

J'ai une petite idée sur celui de sango.

J'essaie, et je vous dis si ça sert. glasses.gif

 Adresse email Haut de page Bas de page 
 
sandro



Autorisation : Membre
Nb de messages : 1387
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Sam 07 Jan 2012, 15:57   Citer 


Citer
A Linka :


Citer
DelVar [A]{3,3üdim([A]



Le DelVar[A] sert-il ?


à avoir une matrice qui ne contient que des 0 peut-être (c'est plus cour que Fill(0,[A] non?


Citer

Citer
min(3,max(1,X-(K=24)+(K=26üX
min(3,max(1,Y-(K=25)+(K=34üY



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
 Adresse email Haut de page Bas de page 
 
Sangohan38



Autorisation : Membre
Nb de messages : 3370
Inscrit le : Sam 31 Déc 2005, 19:48
Posté le : Sam 07 Jan 2012, 19:39   Citer 

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.

Sangohan38

 Adresse email Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3767
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Dim 08 Jan 2012, 22:01   Citer 

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)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
Alex6542
Invité
Posté le : Ven 11 Oct 2013, 12:58   Citer 

comment ecrire Strl ? ahh.gif

  Haut de page Bas de page 
 
m@thieu41



Autorisation : Membre
Nb de messages : 856
Inscrit le : Mer 18 Juil 2012, 18:44
Posté le : Ven 11 Oct 2013, 18:32   Citer 

Bonjour?
Merci?
S'il vous plait?
Modèle utilisé?

A croire qu'on enseigne plus la politesse de nos jours...

Str1 = Chaine1 sur une calto .fr
Les chaines sont disponibles dans le menu [var],[0]

----------------------
Pour vous aidez dans vos débuts (et même ensuite ^^) :
*Tuto Algo->Ti Basic (par Linkakro) : Traduisez vos algo (de type algobox) en prgm pour votre TI!
*Catalogue des emplacements et traductions (anglais/français) des fonctions sur la TI.
*Faites vos propres programmes de maths (par ash)

Et au fait: la politesse n'a jamais tué personne winkle.gif
 Adresse email Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3767
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Ven 11 Oct 2013, 20:14   Citer 

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 des
traductions 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)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
Poster un nouveau sujet Poster une réponse





  Powered by Fire-Soft-Board v1.0.10 © 2004 - 2024 Groupe FSB
Page générée en 9 requêtes
BlackOne par Grimmlink