Autorisation : Membre
Nb de messages : 177
Inscrit le : Dim 27 Mai 2012, 20:38
Posté le : Mar 12 Jui 2012, 20:36
Bonjour,
Je suis en train de faire un programme mais j'ai une expression vraiment longue à entrer, que je ne sais pas vraiment comment optimiser :
Code
If XY=L²(1)L²(2:EffVar L²(1)EffVar L²(2
If XY=L²(3)L²(4:EffVar L²(3)EffVar L²(4
If XY=L²(5)L²(6:EffVar L²(5)EffVar L²(6
If XY=L²(7)L²(8:EffVar L²(7)EffVar L²(8
...
If XY=L²(33)L²(34:EffVar L²(33)EffVar L²(34
Je sais que c'est faisable en utilisant une boucle "For" mais ça risque quand même de ralentir le programme. Donc j'ai pensé tout réunir dans une seule condition :
Code
If max(XY={L²(1)L²(2),L²(3)L²(4),...,L²(33)L²(34
Mais le problème c'est qu'il me faudrait une fonction qui me dirait quel produit est égal à XY pour pouvoir l'effacer, parce que là, je ne sais pas quoi mettre après.
Si vous avez des propositions, je suis preneur.
Merci d'avance.
---------------------- Il y a 10 types de personnes dans le monde : celles qui comprennent le binaire et celles qui ne le comprennent pas.
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Mar 12 Jui 2012, 22:00
Il ne faut pas utiliser EffVar mais 0->L2(1).
Sinon tu supprimmes toute la liste.
Hélas cela rend impossible l'usage de l'astuce de la concaténation de EffVar.
Code
If XY=L²(1)L²(2:Then:0->L2(1):0->L2(2):End
If XY=L²(3)L²(4:Then:0->L2(3):0->L2(4):End
...
---------------------- 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 : 177
Inscrit le : Dim 27 Mai 2012, 20:38
Posté le : Mar 12 Jui 2012, 22:15
Aïe... Merci pour votre réponse mais du coup là ça va vraiment rallonger le programme surtout que cette expression se trouve dans une boucle... J'ai eu une idée pour réduire mais ça sera toujours un peu lent :
Code
For(A,1,33,2
If L²(A)L²(A+1)=XY
Then
0->L²(A
0->L²(A+1
End
End
Quelqu'un a une autre idée ?
---------------------- Il y a 10 types de personnes dans le monde : celles qui comprennent le binaire et celles qui ne le comprennent pas.
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Mar 12 Jui 2012, 22:22
Si on sépare les données en deux listes, il sera possible d'effectuer un simple produit ou test.
Mettons L2(2) dans L3(1), L2(3) dans L2(2), L2(4) dans L3(2) ...
Code
L2L3->L4
For(A,1,17
If XY=L4(A
Then
0->L2(A
0->L3(A
End
...
End
Le produit XY est-il une manière de tester une double égalité ?
Quel type de données peuvent représenter X,Y et la liste ?
Est-ce possible que plusieurs If soient validés au même moment ?
Si non, il est probablement possible d'effectuer une simple affectation.
Mais cela reste encore trop compliqué si je ne connais pas tout ton concept.
Si on a deux listes, et qu'une seule égalité est possible, cela donne
Code
max({1,2,...,16,17}(XY=L2L3->A
If A
Then
0->L2(A
0->L3(A
End
On peut remplacer ma {1,2,...} par suite(A,A,1,17) mais ce serait plus lent.
Si on a deux listes, qu'on veut tester deux égalités, et qu'une seule paire d'égalités est possible, cela donne
Code
max({1,2,...,16,17}(max(X=L2,Y=L3->A
If A
Then
0->L2(A
0->L3(A
End
On peut remplacer ma {1,2,...} par suite(A,A,1,17) mais ce serait plus lent.
S'il peut y avoir plusieurs les égalités valides, il convient plutôt d'écrire :
Code
max({1,2,...,16,17}(XY=L2L3->A
While A
0->L2(A
0->L3(A
max({1,2,...,16,17}(XY=L2L3->A
End
Je n'ai pas testé grandeur nature mes propositions.
---------------------- 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 : 177
Inscrit le : Dim 27 Mai 2012, 20:38
Posté le : Mer 13 Jui 2012, 14:26
Merci beaucoup Linkakro.
En fait, je programme une bataille navale et X correspond à l'abscisse du point sur lequel le joueur va "frapper" et Y est son ordonnée. Sauf que je n'avais pas "empêché" que l'on puisse mettre une case commune à deux bateaux parce qu'après tout, c'est ce pénaliser soi-même et surtout que ça aurait rallonger le programme. Mais vu que maintenant ça me rallonge le programme je vais remonter dans mon programme et ajouter une condition, mais après le bac...
---------------------- Il y a 10 types de personnes dans le monde : celles qui comprennent le binaire et celles qui ne le comprennent pas.