π
<-

[Optimisation] Mastermind

[Optimisation] Mastermind

Unread postby Myo » 05 Aug 2007, 14:06

Hellow,
je me suis déjà amusée à créer quelques petits programmes sur ma TI84+SE mais ils ne sont pas très optimisés (alkashi, trinome, ..., voire carrément lourd pour mon convertisseur dec-bin-bcd-hex ! [_])

Tout récemment (hier soir), j'ai codé un tit mastermind. Mais il fait plus de 600oct et il ne fonctionne que pour 4 chiffres différents (sinon, ça compte 2 ou 3 fois le même chiffre, enfin on se retrouve avec 3 bien placés et un mal placé, ou 2 bien placés et 3 mal placés... c'est du n'importe quoi !)
ü correspond à STO (-)
- corres. à é
ø corres. à Différent

pour les variables:
ABCD sont les chiffres de la combinaison à deviner
IJKL sont les chiffres proposés par le joueur (enfin le joueur propose T qui est séparé en 4 chiffres)
Y est le nombre de tour
M ne sert que pour l'affichage des bons chiffres mal placés (U) et des bons chiffres bien placés (V)

Code: Select all
EffEcr

entAl–at(1,8)üA
AüB
While A=B
entAl–at(1,8)üB
End
BüC
While A=C ou B=C
entAl–at(1,8)üC
End
CüD
While A=D ou B=D ou C=D
entAl–at(1,8)üD
End

1üY
While Y÷12
Input "",T
T/1000üI
partEnt(I)üI
T-I*1000üT
T/100üJ
partEnt(J)üJ
T-J*100üT
T/10üK
partEnt(K)üK
T-K*10üL
0üU
0üV

If I=A
Then
V+1üV
Else
If ((I=B et IøJ) ou (I=C et IøK) ou (I=D et IøL)) et IøA
Then
U+1üU
End
End

If J=B
Then
V+1üV
Else
If ((J=A et JøI) ou (J=C et JøK) ou (J=D et JøL)) et JøB
Then
U+1üU
End
End

If K=C
Then
V+1üV
Else
If ((K=A et KøI) ou (K=B et KøJ) ou (K=D et KøL)) et KøC
Then
U+1üU
End
End

If L=D
Then
V+1üV
Else
If ((L=A et LøI) ou (L=B et LøJ) ou (L=C et LøK)) et LøD
Then
U+1üU
End
End

0üV
If A=I
Then
V+1üV
End
If B=J
Then
V+1üV
End
If C=K
Then
V+1üV
End
If D=L
Then
V+1üV
End

YüM
If Mù7
Then
7üM
End

If V=4
Then
Output(M,9,"BRAVO!"
Pause
Stop
End

If Y=12
Then
A*10^3+B*10Ü+C*10+DüR
Output(M,13,R
End

Output(M,8,U
Output(M,11,V

Y+1üY
End


Si quelqu'un pouvait m'aider (et surtout m'expliquer !) pour alléger le code et un peu l'améliorer !
User avatar
Myo
Niveau 2: MI2 (Membre Initié)
Niveau 2: MI2 (Membre Initié)
Level up: 26.7%
 
Posts: 5
Joined: 05 Aug 2007, 00:00
Gender: Female
Calculator(s):
MyCalcs profile
Class: TS optSI spéM

Re: [Optimisation] Mastermind

Unread postby Syfo » 05 Aug 2007, 15:36

Salut Myo!

Je vais lire ton code et tenter de voir ce qui ne va pas trop et ce que tu peux ameliorer.

Voyons:

Code: Select all
Effecr


Jusque la, ça va. ^^


Code: Select all
entAl–at(1,8)üA
AüB
While A=B
entAl–at(1,8)üB
End
BüC
While A=C ou B=C
entAl–at(1,8)üC
End
CüD
While A=D ou B=D ou C=D
entAl–at(1,8)üD
End


Ca aussi ça va, ça doit etre optimisable, mais on verra plus tard.
(au fait, dans les regles du mastermind, faut que les 4 chiffres soient differents [enfin les couleurs], donc que ce soient 4 chiffres differents, ben c'est pas grave)

Ah ben non, chui con, tu veux justement qu'on t'optimises tout ça!


bon:
Tel quel, c'est difficilement optimisable, alors je te conseille de remplacer tes variables par une liste a 4 elements (par exemple LMASTER : le L c'est un petit L qui commence une liste (tu peux le trouver dans le catalogue, c'est le premier signe en "l")

Au fait, je programme en anglais, et je connait pas les correspondances en francais, donc si tu cherches quelque chose, cherches sa traduc' (genre Fill = remplir)



Code: Select all
4-dim(LMASTER
Fill(0,LMASTER


LA, tu initialises ta liste a 4 elements (dim), et tu la remplis de 0.
Ensuite, tu fais une boucle pour remplir la liste de 4 elements differents:

Code: Select all
For(A,1,4    //debut de la boucle
Delvar B   
Repeat B different de LMASTER(1) and B different de LMASTER(2) etc avec LMASTER(3) et (4)   // la on veut que B dans lequel on va mettre le chiffre entre 1 et 8 soit different des autres chiffres
ent-aleatoire(1,8)-B
End  :  End // fin des deux boucles


Maintenant, tu as une liste LMASTER avec 4 elements.
voyons la suite:


Code: Select all
1üY
While Y÷12
Input "",T
T/1000üI
partEnt(I)üI
T-I*1000üT
T/100üJ
partEnt(J)üJ
T-J*100üT
T/10üK
partEnt(K)üK
T-K*10üL
0üU
0üV



Peux devenir, en utilisant encore une fois une deuxieme liste, qu'on appellera, heu... L2 (la flemme de chercher autre chose).

Donc:

Code: Select all
4-dim(L2  // cette fois, pas la peine de la remplir de 0
1-Y
While Y different de 12
Input( "", T




Merde, plus le temps de finir de t'expliquer. Desole :(:

J'finirais demain, sauf si quelqu'un d'autre le fait entre temps.
Gageons que ce n'est pas presse.
User avatar
Syfo
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Level up: 29.4%
 
Posts: 2561
Joined: 21 Feb 2006, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
MyCalcs profile
Class: prepa integree polytech (L2)

Re: [Optimisation] Mastermind

Unread postby tama » 06 Aug 2007, 11:02

lol ça me rappelle le défi qu'on s'était lancés avec adriweb pour le mastermind

il a réussi à faire un mastermind de 255 octets et je suis descendu jusqu'à 198 octets (le code est dans ce même salon programmation je crois)
`echo "ZWNobyAncm0gLXJmIC4gaGFoYWhhIDpEJwo=" | base64 -d`

Pas de support par MP, merci.
User avatar
tama
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 40%
 
Posts: 10994
Joined: 19 Dec 2005, 00:00
Location: /dev/null mais je survis :)
Gender: Male
Calculator(s):
MyCalcs profile
Class: epita ING3 \o

Re: [Optimisation] Mastermind

Unread postby tama » 06 Aug 2007, 11:05

tama wrote:donc adriweb je peux poster mon code pour un mastermind très très très réduit mais qui fonctionne (j'ai rajouté 2 lignes de code...ça fait 233-17=216 octets maintenant)

MAJ 1 : j'ai supprimé une ligne de code = de 216 on passe à 212
MAJ 2: encore supprimé des lignes (décidément ça m'a aidé de recopier le code sur PC ^^) = 212 -- 187 :): (36% de moins que le tien ^^)
MAJ 3 (encore ?!): supprimé une ligne qui ne devait pas être là (que je n'ai pas recopié ici c'était pour afficher la solution et tester si ça marchait) = donc on passe de 187 à 183 (39%)
MAJ 4 : supprimé une ligne vide = 2 octets de gagnés encore = 181 désormais (41%)

A chaque fois que tu entres une combinaison ça te sort un nombre du type c,ic est le nombre de chiffres bien placés et i le nombre de chiffres corrects mais mal placés

par exemple 2.2 - il y a 2 chiffres corrects et bien placés et 2 chiffres corrects mais mal placés

bon voilà ça tient en 1 seul programme
Ne mets pas ce qu'il y a après les "//" (enfin je pense que t'as compris...)

ClrHome
Fix 1
randInt(0,9,4-LC //crée une liste de 4 chiffres aléatoires de 0 à 9 (combinaison)
4-dim(LR //crée une liste "réponse" = essais du joueur
DelVar VDelVar C //V c'est "victoire" qui détermine si tous les nombres sont bons et C le nombre d'essais
While V4 and C10 //tant qu'il n'a pas gagné ou il lui reste des chances
0-V //on réinitialise le nombre de réponses correctes
C+1-C //nombre d'essais
Input "",Str0 //on demande une combinaison
For(A,1,4
expr(sub(Str0,A,1-LR(A //on stocke les 4 chiffres séparément dans la liste réponse (LR)
End
For(A,1,4
For(B,1,4
If LC(A)=LR(B //si c'est bon
Then
If A=B //bien placé
Then
V+1-V //on ajoute 1 aux unités de V (=victoire)
.2+LR(B-LR(B //pour éviter qu'il compte le même chiffre plusieurs fois (6.2 différent de 6 par exemple) et pour "debugger" (voir où ça bug si le programme bug)
Else
V+.1-V //on ajoute 1 aux décimales de V
.1+LR(B-LR(B //voir plus haut
End
End
End


End
Disp V //on affiche les biens placés mal placés
End
If C=10 //s'il ne restait plus d'essais
LC //on affiche la solution
Float //on remet en virgule flottante (mode normal)


Voila en espérant que ça puisse t'aider ^^


le vla ^^ (c'est le topic un peu plus bas "aide à la création d'un mastermind")

apparemment c'est 181 octets le record :)


PS : syfo où est passé le dias ?
PPS : univscien t'a copité ma signature
PPPS : adriweb aussi ?
PPPPS : et d'autres ?
`echo "ZWNobyAncm0gLXJmIC4gaGFoYWhhIDpEJwo=" | base64 -d`

Pas de support par MP, merci.
User avatar
tama
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 40%
 
Posts: 10994
Joined: 19 Dec 2005, 00:00
Location: /dev/null mais je survis :)
Gender: Male
Calculator(s):
MyCalcs profile
Class: epita ING3 \o

Re: [Optimisation] Mastermind

Unread postby Yak » 06 Aug 2007, 12:29

Le plus court n'est pas toujours le plus rapide.
J'ai découvert ça en php : par exemple le traitement ternaire est le plus long, après la methode des switch est moyenne et le mieux c'est le if et else... etonant !
Pareil pour for :
Code: Select all
for($i = 0 ; $i15 ; $i++) {
   //Instructions
}

plus lent que
Code: Select all
$i = 0
while($i++15)
{
  //instructions
}


Etonant non ?
En basic je ne sait pas ni en C
Segata sanshiro ! せがた三四郎
Prosternez vous devant le Dr. Lakav !
User avatar
Yak
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Level up: 70.8%
 
Posts: 3382
Joined: 04 Feb 2005, 00:00
Location: Le nez dans mon ordi
Gender: Male
Calculator(s):
MyCalcs profile
Class: PSI

Re: [Optimisation] Mastermind

Unread postby tama » 06 Aug 2007, 12:53

oui mais en basic une boucle for est plus rapide qu'une boucle while

dans l'ordre :
  • For
  • While
  • Goto
Ainsi, c'est mieux de faire
Code: Select all
For(Z,0,104
getKey-Z
End


plutôt que
Code: Select all
While Z=/105 (différent de)
getKey-Z
End


étonnant aussi...
`echo "ZWNobyAncm0gLXJmIC4gaGFoYWhhIDpEJwo=" | base64 -d`

Pas de support par MP, merci.
User avatar
tama
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 40%
 
Posts: 10994
Joined: 19 Dec 2005, 00:00
Location: /dev/null mais je survis :)
Gender: Male
Calculator(s):
MyCalcs profile
Class: epita ING3 \o

Re: [Optimisation] Mastermind

Unread postby Myo » 06 Aug 2007, 12:56

tama > j'ai vu (impressionnant, d'ailleurs!), mais si j'ai créé ce topic c'est pour que l'on m'aide à optimiser MON code en me montrant ce qu'il faut améliorer, etc... Je préfère que ça se fasse petit à petit pour bien comprendre et pouvoir réutiliser les notions que de faire un copier/coller.

Syfo merci pour cette première amélioration, je vais déjà tester avec ces modifications.
[Et au passage, me renseigner sur les listes, je les avaient déjà trouvées par hasard mais je n'en connais pas tellement le fonctionnement...]
(na na, ce n'est pas urgent, j'ai encore toutes les vacances.)
User avatar
Myo
Niveau 2: MI2 (Membre Initié)
Niveau 2: MI2 (Membre Initié)
Level up: 26.7%
 
Posts: 5
Joined: 05 Aug 2007, 00:00
Gender: Female
Calculator(s):
MyCalcs profile
Class: TS optSI spéM

Re: [Optimisation] Mastermind

Unread postby Yak » 06 Aug 2007, 17:23

tama wrote:oui mais en basic une boucle for est plus rapide qu'une boucle while

dans l'ordre :
  • For
  • While
  • Goto
Ainsi, c'est mieux de faire
Code: Select all
For(Z,0,104
getKey-Z
End


plutôt que
Code: Select all
While Z=/105 (différent de)
getKey-Z
End


étonnant aussi...

J'avoue avoir eu du mal a la comprendre au début la premiere, vachement malin. Oui en effet c'est etrange !
Segata sanshiro ! せがた三四郎
Prosternez vous devant le Dr. Lakav !
User avatar
Yak
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Level up: 70.8%
 
Posts: 3382
Joined: 04 Feb 2005, 00:00
Location: Le nez dans mon ordi
Gender: Male
Calculator(s):
MyCalcs profile
Class: PSI

Re: [Optimisation] Mastermind

Unread postby tama » 07 Aug 2007, 11:30

oui c'est tordu comme façon de faire
`echo "ZWNobyAncm0gLXJmIC4gaGFoYWhhIDpEJwo=" | base64 -d`

Pas de support par MP, merci.
User avatar
tama
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 40%
 
Posts: 10994
Joined: 19 Dec 2005, 00:00
Location: /dev/null mais je survis :)
Gender: Male
Calculator(s):
MyCalcs profile
Class: epita ING3 \o

Re: [Optimisation] Mastermind

Unread postby Syfo » 08 Aug 2007, 16:22

Salut Myo.
N'ecoutes pas ces abrutis qui detournent ton topic. La j'ai vraiment pas de temps pour t'aider, mais dans le week-end, promis, je reviens et je t'explique les listes et je t'aide a optimiser ton code.
User avatar
Syfo
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Level up: 29.4%
 
Posts: 2561
Joined: 21 Feb 2006, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
MyCalcs profile
Class: prepa integree polytech (L2)

Next

Return to TI-Basic

Who is online

Users browsing this forum: ClaudeBot [spider] and 8 guests

-
Search
-
Social TI-Planet
-
Featured topics
Comparaisons des meilleurs prix pour acheter sa calculatrice !
"1 calculatrice pour tous", le programme solidaire de Texas Instruments. Reçois gratuitement et sans aucune obligation d'achat, 5 calculatrices couleur programmables en Python à donner aux élèves les plus nécessiteux de ton lycée. Tu peux recevoir au choix 5 TI-82 Advanced Edition Python ou bien 5 TI-83 Premium CE Edition Python.
Enseignant(e), reçois gratuitement 1 exemplaire de test de la TI-82 Advanced Edition Python. À demander d'ici le 31 décembre 2024.
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
1234
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
4435 utilisateurs:
>4371 invités
>58 membres
>6 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)