π
<-

[Optimisation] Mastermind

[Optimisation] Mastermind

Message non lude Myo » 05 Aoû 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: Tout sélectionner
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 !
Avatar de l’utilisateur
Myo
Niveau 2: MI2 (Membre Initié)
Niveau 2: MI2 (Membre Initié)
Prochain niv.: 26.7%
 
Messages: 5
Inscription: 05 Aoû 2007, 00:00
Genre: Femme
Calculatrice(s):
MyCalcs profile
Classe: TS optSI spéM

Re: [Optimisation] Mastermind

Message non lude Syfo » 05 Aoû 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: Tout sélectionner
Effecr


Jusque la, ça va. ^^


Code: Tout sélectionner
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: Tout sélectionner
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: Tout sélectionner
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: Tout sélectionner
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: Tout sélectionner
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.
Avatar de l’utilisateur
Syfo
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 29.4%
 
Messages: 2561
Inscription: 21 Fév 2006, 00:00
Localisation: Montpellier
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: prepa integree polytech (L2)

Re: [Optimisation] Mastermind

Message non lude tama » 06 Aoû 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.
Avatar de l’utilisateur
tama
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 40%
 
Messages: 10994
Inscription: 19 Déc 2005, 00:00
Localisation: /dev/null mais je survis :)
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: epita ING3 \o

Re: [Optimisation] Mastermind

Message non lude tama » 06 Aoû 2007, 11:05

tama a écrit: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.
Avatar de l’utilisateur
tama
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 40%
 
Messages: 10994
Inscription: 19 Déc 2005, 00:00
Localisation: /dev/null mais je survis :)
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: epita ING3 \o

Re: [Optimisation] Mastermind

Message non lude Yak » 06 Aoû 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: Tout sélectionner
for($i = 0 ; $i15 ; $i++) {
   //Instructions
}

plus lent que
Code: Tout sélectionner
$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 !
Avatar de l’utilisateur
Yak
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 70.8%
 
Messages: 3382
Inscription: 04 Fév 2005, 00:00
Localisation: Le nez dans mon ordi
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: PSI

Re: [Optimisation] Mastermind

Message non lude tama » 06 Aoû 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: Tout sélectionner
For(Z,0,104
getKey-Z
End


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


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

Pas de support par MP, merci.
Avatar de l’utilisateur
tama
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 40%
 
Messages: 10994
Inscription: 19 Déc 2005, 00:00
Localisation: /dev/null mais je survis :)
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: epita ING3 \o

Re: [Optimisation] Mastermind

Message non lude Myo » 06 Aoû 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.)
Avatar de l’utilisateur
Myo
Niveau 2: MI2 (Membre Initié)
Niveau 2: MI2 (Membre Initié)
Prochain niv.: 26.7%
 
Messages: 5
Inscription: 05 Aoû 2007, 00:00
Genre: Femme
Calculatrice(s):
MyCalcs profile
Classe: TS optSI spéM

Re: [Optimisation] Mastermind

Message non lude Yak » 06 Aoû 2007, 17:23

tama a écrit: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: Tout sélectionner
For(Z,0,104
getKey-Z
End


plutôt que
Code: Tout sélectionner
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 !
Avatar de l’utilisateur
Yak
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 70.8%
 
Messages: 3382
Inscription: 04 Fév 2005, 00:00
Localisation: Le nez dans mon ordi
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: PSI

Re: [Optimisation] Mastermind

Message non lude tama » 07 Aoû 2007, 11:30

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

Pas de support par MP, merci.
Avatar de l’utilisateur
tama
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 40%
 
Messages: 10994
Inscription: 19 Déc 2005, 00:00
Localisation: /dev/null mais je survis :)
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: epita ING3 \o

Re: [Optimisation] Mastermind

Message non lude Syfo » 08 Aoû 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.
Avatar de l’utilisateur
Syfo
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 29.4%
 
Messages: 2561
Inscription: 21 Fév 2006, 00:00
Localisation: Montpellier
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: prepa integree polytech (L2)

Suivante

Retourner vers TI-Basic

Qui est en ligne

Utilisateurs parcourant ce forum: ClaudeBot [spider] et 1 invité

-
Rechercher
-
Social TI-Planet
-
Sujets à la une
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
-
Faire un don / Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
Faire un don
Découvrez les avantages d'un compte donateur !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partenaires et pub
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1341 utilisateurs:
>1299 invités
>35 membres
>7 robots
Record simultané (sur 6 mois):
7582 utilisateurs (le 25/06/2025)
-
Autres sites intéressants
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)