[Basic] Optimisation, bien utiliser Ans

Voir le sujet précédent Voir le sujet suivant Aller en bas

[Basic] Optimisation, bien utiliser Ans

Message par maxence le Sam 6 Avr - 12:31

Ce "tutoriel" s’adresse plutôt aux débutants qu'aux codeurs confirmés.
En TI-basic, il est important de faire en sorte que son code soit le plus léger possible, et Ans est un outils bien pratique pour cela, nous allons voir comment mieux nous en servir.

Sommaire:
I) Qu'est-ce que 'Ans' ?

II) Méthode 'simple'
1) Calcul de gain et de rentabilité
2) Exemples

III) Booléens

IV) Plus d'exemples

Partie I :

Dans tout programme, ou sur l'écran d'accueil, "Ans" ou "Rep" en français, et une sorte de variable qui peut stocker tout type d'information, mais pas n'importe comment. Sa valeur est le résultat du dernier calcul ou de la dernière commande effectuée.
Par exemple:
Code:

:4(2+5)
:Disp Ans // Affiche 28 à l'écran

Ans peut stocker un nombre, une phrase, matrice, liste... Tous les types de variables possibles et imaginables.
On peut donc exploiter cette propriété pour remplacer une bout de code qui apparaît plusieurs fois, par Ans:
Code:

:Disp (A+B-C)(A+B+C)

// Devient

:A+B
:Disp (Ans-C)(Ans+C)

Et le "token" Ans ne prend que un seul octet, ce qui peut nous permettre d'en économiser si on s'en sert bien ! Content

Partie II :

1) Calcul de gain et de rentabilité

Ans, c'est bien, mais encore faut'il savoir quand l'utiliser. Et c'est là que se trouve le problème majeur, car mal utilisé, on peut perdre des octets au lieu d'en gagner. Le but du jeu est donc de savoir rapidement si en utilisant Ans, on va être gagnant ou perdant, et de combien.

Voici donc le calcul qui permet de le savoir:
G = Nombre d'octets gagnés grâce à Ans
L = Le nombre d'octets pris par la portion de code à remplacer
R = Le nombre de fois où cette portion de code apparaît dans la code à optimiser.

G = (L-1)(R-1)-2

Par exemple, pour reprendre le code de tout à l'heure:
Code:

:Disp (A+B-C)(A+B+C)

// Devient

:A+B
:Disp (Ans-C)(Ans+C)

// "A+B" prend 3 octets : L = 3
// "A+B" apparaît deux fois dans la commande "Disp (A+B-C)(A+B+C)" : R = 2
// G = (3-1)(2-1)-2 = 2*1-2 = 0 : On a donc rien gagné en remplaçant "A+B" par Ans.
// Si le résultat avait été négatif, c'est que l'on aurait perdu des octets, positif, on en gagne.

Maintenant, comment savoir, sans faire ce calcul, si l'utilisation de Ans va être rentable ?
Etant donné que "G = (L-1)(R-1)-2", il ne faut pas que L ou R soit inférieur à 2, sinon on est sur de perdre.
Etant donné que l'on retire "2" à la fin, il faut même dans le cas où "(L-1) = 1", que le produit fasse au moins 3.

Donc, l'utilisation de Ans est rentable si:
- L > 1
- R > 1
- L+R > 3

2) Exemples
Pour comprendre rien de mieux que quelques exemples (non réalistes), je mettrais toujours le code à optimiser avant, et le code optimisé après, puis la calcul des gains :

Code:
:Promt A,B,C
:A(B+C)+B(B+C)+C(B+C)→D

:Prompt A,B,C
:B+C
:AAns+BAns+CAns→D

Calcul des gains : L = 3 et R = 3
G = (3-1)(3-1)-2 = 2*2-2 = 2 // On gagne donc 2 octets. (en réalité on en gagne 8, car les 6 parenthèses on disparues, c'est un autre avantage de Ans !

Partie III :

Qu'est-ce qu'un booléen ? C'est tout simplement une condition, quelque chose qui peut soit être vrai ou faux. Ce booléen et le résultat d'une opération logique, comme un test entre deux variable. Sur TI, on représente ces deux états par 1 (vrai) et 0 (faux).

Par exemple, sur l'écran de calcul, si je fait "1=1", ce qui est vrai, la calculatrice m'affiche "1" pour me dire que c'est vrai. Et si je fait "1=2", elle m'affiche 0 car cela est faux.

L'avantage, c'est que c'est un résultat concret, qui peux très bien être stocké dans une variable, ou bien dans... Ans !

Par exemple, je veux effectuer des opérations du une chaîne de caractères seulement si il y a des "o" dedans, le tout dans une boucle, mais je veux être sûr qu'elle soit exécutée au moins une fois, et que celle-ci s'arrête en entrée de boucle si il n'y en a pas, ça nous donne quelque chose comme :
Code:
// ... Ça coince dès la condition d'entrée, il faut que la condition test si il y a des "o" dans la chaîne, mais aussi qu'elle passe automatiquement si c'est la première boucle, il faut créer un système de variable, c'est long et lourd...

// Heureusement, Ans peux nous aider sur ce coup là :

:1
:While Ans
:// On effectue des opérations sur la chaîne en question (ici Str1)
:inString(Str1, "O")
:End


 Explication du code : Tout d'abord, on met Ans à 1. Sur la deuxième ligne, on test si Ans est différent de 0 (rappelez vous, "If A" revient à écrire "If A≠0"), et on vient juste de le mettre à 1, donc on peut entrer dans la boucle. Ensuite on effectue les opérations, puis, on fait un test à priori "dans le vide", mais en fait, son résultat est stocké dans Ans ! On remonte ensuite, et là, on re-test Ans, sauf que cette fois on cherche vraiment à savoir si il reste des "O" dans Str1 !

Et oui, c'est ça qui est très pratique, on peux très bien avoir plusieurs conditions différentes dans une même boucle, juste en faisant varier les tests sur Ans !

Un autre exemple, cette fois un code concret, tiré de TXT, c'est le système de réception de textes :

Code:
:DelVarStr00 // Attention, ce n'est pas très lisible, c'est la chaîne Str0 suivie du caractère 0, car on met Ans à 0, on peux se permettre de le coller ici, c'est un bug de DelVar...
:repeat Ans=4 or length(Str0 // On sort si Ans est égal à 4 ou si la chaîne Str0 a bien été reçue
:Ans+1 // On incrémente Ans, il est automatiquement modifié, car c'est le résultat du dernier calcul
:getCacl(Str0
:End

Ici, la condition ne change pas, mais on se sert de Ans comme un compteur, on économise ainsi une variable, et en plus, on gagne 4 octets, car on a besoin de mettre ni "0→A", ni "A+1→A"

Partie IV :

// A venir, mais comportera des exemples inclassables...


Dernière édition par maxence le Mar 28 Jan - 18:26, édité 15 fois

maxence
Or 4
Or 4

Sexe : Masculin
Age : 20
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :
  • - TI-Basic Z80
  • - Axe Parser
Calculatrices :
  • - TI-84+

TI-84+


Revenir en haut Aller en bas

Re: [Basic] Optimisation, bien utiliser Ans

Message par nikitouzz le Sam 6 Avr - 15:36

c'est pas mal comme tutoriel !

ca m'a un peu aidee meme, continue le bien car ans est une belle optimisation Content

_________________
[Vous devez être inscrit et connecté pour voir cette image]
Invité née le 0 a aujord'huis 0 ans et a posté 11 messages... je suis derrière vous

2x2x2 : 2.18 secondes / 2x2x2 une main : 21.15 secondes / 2x2x2 yeux bandés : 47.59
3x3x3 : 5.97 secondes / 3x3x3 une main : 49.86 secondes
4x4x4 : 1.49 minutes / 4x4x4 une main : 6.50 minutes
5x5x5 : 4.10 minutes / 5x5x5 une main : 18.02 minutes
6x6x6 : 8.10 minutes
7x7x7 : 16.03 minutes
9x9x9 : 58.26 minutes

3x3x1 : 0.73secondes / 3x3x2 : 30.55secondes / 3x3x3 : 5.97secondes / 3x3x4 : 1.09minutes / 3x3x5 : 1.46minutes / 3x3x6 : 2.06minutes

megaminx : 5.59 minutes / pyraminx : 7.91 secondes / square-one : 1.07

nikitouzz
Platinum 1
Platinum 1

Sexe : Masculin
Age : 21
Messages : 1834
Date d'inscription : 16/01/2011
Points Forum : 7
Points Concours : 6
Langages :
  • - TI-Basic Z80
  • - ASM TI-83+ / TI-84+
  • - Axe Parser
  • - TI-Basic 68K
  • - TI-Basic Nspire
Calculatrices :
  • - TI-73
  • - TI-76.fr
  • - TI-82 Stats.fr
  • - TI-83+
  • - TI-84+
  • - TI-92
  • - TI-Nspire
  • - TI-Nspire CX

TI-84+ SE


Revenir en haut Aller en bas

Re: [Basic] Optimisation, bien utiliser Ans

Message par linkakro le Sam 6 Avr - 15:59

C'est un bon début.

Pour l'instant ton tuto porte sur la détermination des économies de codes obtenues par remplacement.
Et ce pour n'importe quel remplacement.

Mais j'aurais plutôt attendu des comparaisons entre des algorithmes classiques et avec Ans, c'est là que cela devient le plus intéressant.

linkakro
Or 4
Or 4

Sexe : Masculin
Age : 22
Messages : 768
Date d'inscription : 01/07/2010
Etudes : dut geii (elec/info)
Points Forum : 51
Points Concours : 8
Langages :
  • - TI-Basic Z80
  • - ASM TI-82 Stats / TI-83
  • - ASM TI-83+ / TI-84+
Calculatrices :
  • - TI-82 Stats.fr
  • - TI-84 Pocket.fr

TI-84+ SE


Revenir en haut Aller en bas

Re: [Basic] Optimisation, bien utiliser Ans

Message par maxence le Sam 6 Avr - 16:28

Oui je vais le completer, mais pour l'instant je ne peux pas car je suis avec mon portable et j'ai des soucis avec la mémoire tampon trop faible.


Dés que j'en aurais l'occasion, je modifierais mon post, j'ai trouvé un plan:

I) La méthode simple
1) Calculs de gain et de limite de rentabilité
2) Exemples

II) La méthode par liste
1) Calculs de gain et de limite de rentabilité
2) Exemples

III) Remplacements et booléens
1) Exemples

IV) Remplacement dans un remplacement
1) Calcul du gain dans le gain
2) Exemples

V) Plus d'exemples

maxence
Or 4
Or 4

Sexe : Masculin
Age : 20
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :
  • - TI-Basic Z80
  • - Axe Parser
Calculatrices :
  • - TI-84+

TI-84+


Revenir en haut Aller en bas

Re: [Basic] Optimisation, bien utiliser Ans

Message par nikitouzz le Mar 9 Avr - 9:57

bon plan meme si le IV) 1) ne me parle pas tout de suite ^^

en tout cas ca va beaucoup m'aidée pour la programmation en basic.

_________________
[Vous devez être inscrit et connecté pour voir cette image]
Invité née le 0 a aujord'huis 0 ans et a posté 11 messages... je suis derrière vous

2x2x2 : 2.18 secondes / 2x2x2 une main : 21.15 secondes / 2x2x2 yeux bandés : 47.59
3x3x3 : 5.97 secondes / 3x3x3 une main : 49.86 secondes
4x4x4 : 1.49 minutes / 4x4x4 une main : 6.50 minutes
5x5x5 : 4.10 minutes / 5x5x5 une main : 18.02 minutes
6x6x6 : 8.10 minutes
7x7x7 : 16.03 minutes
9x9x9 : 58.26 minutes

3x3x1 : 0.73secondes / 3x3x2 : 30.55secondes / 3x3x3 : 5.97secondes / 3x3x4 : 1.09minutes / 3x3x5 : 1.46minutes / 3x3x6 : 2.06minutes

megaminx : 5.59 minutes / pyraminx : 7.91 secondes / square-one : 1.07

nikitouzz
Platinum 1
Platinum 1

Sexe : Masculin
Age : 21
Messages : 1834
Date d'inscription : 16/01/2011
Points Forum : 7
Points Concours : 6
Langages :
  • - TI-Basic Z80
  • - ASM TI-83+ / TI-84+
  • - Axe Parser
  • - TI-Basic 68K
  • - TI-Basic Nspire
Calculatrices :
  • - TI-73
  • - TI-76.fr
  • - TI-82 Stats.fr
  • - TI-83+
  • - TI-84+
  • - TI-92
  • - TI-Nspire
  • - TI-Nspire CX

TI-84+ SE


Revenir en haut Aller en bas

Re: [Basic] Optimisation, bien utiliser Ans

Message par maxence le Ven 12 Avr - 20:59

Je vais essayer de profiter du week end pour avancer, parce que là c'est un peu juste j'ai les BAC blanc donc pas trop le temps :/

En tout cas j'espère que ça pourra en aider quelque uns Clin Oeil

maxence
Or 4
Or 4

Sexe : Masculin
Age : 20
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :
  • - TI-Basic Z80
  • - Axe Parser
Calculatrices :
  • - TI-84+

TI-84+


Revenir en haut Aller en bas

Re: [Basic] Optimisation, bien utiliser Ans

Message par linkakro le Sam 13 Avr - 11:34

Prépare ton bac d'abord, on n'est pas à quelques jours près.

J'ai déjà ça à proposer. Un cas courant et un cas particulier qui illustre assez bien.
Spoiler:
Code:
Menu("","A",1,"B",2,"C",3
Lbl 1
1->A
Goto 4
Lbl 2
2->A
Goto 4
Lbl 3
3->A
lbl 4
//////////////////////////
1
Menu("","A",1,"B",2,"C",3
Lbl 3
Ans+1
Lbl 2
Ans+1
Lbl 1
Ans->A
Code:
0->A
While 1
Repeat A=/=B
randInt(0,4->B
End
B->A
End
/////////////////////////////
0->A
While 1
Repeat A=/=Ans
randInt(0,4
End
Ans->A
End

linkakro
Or 4
Or 4

Sexe : Masculin
Age : 22
Messages : 768
Date d'inscription : 01/07/2010
Etudes : dut geii (elec/info)
Points Forum : 51
Points Concours : 8
Langages :
  • - TI-Basic Z80
  • - ASM TI-82 Stats / TI-83
  • - ASM TI-83+ / TI-84+
Calculatrices :
  • - TI-82 Stats.fr
  • - TI-84 Pocket.fr

TI-84+ SE


Revenir en haut Aller en bas

Re: [Basic] Optimisation, bien utiliser Ans

Message par Hayleia le Sam 13 Avr - 13:33

maxence a écrit:Je vais essayer de profiter du week end pour avancer, parce que là c'est un peu juste j'ai les BAC blanc donc pas trop le temps :/
Même le vrai BAC ça prend pas du temps, alors le BAC blanc c'est vraiment une excuse bidon [Vous devez être inscrit et connecté pour voir cette image]

Hayleia
Or 4
Or 4

Age : 22
Messages : 406
Date d'inscription : 03/08/2012
Points Forum : 45
Points Concours : 4
Langages :
  • - TI-Basic Z80
  • - Axe Parser
Calculatrices :
  • - TI-76.fr
  • - TI-83+
  • - TI-84+ SE
  • - TI-Nspire CX

TI-84+ SE


Revenir en haut Aller en bas

Re: [Basic] Optimisation, bien utiliser Ans

Message par linkakro le Sam 13 Avr - 13:55

C'est déplacé pour quiconque n'est ni un génie ni une bête à concours. Le bac c'est pour toute la vie alors un excès de préparation vaut mieux que tout.
Et puis agraver le hors-sujet n'apporte rien.


A propos de Ans, je pense important de montrer à la même occasion qu'une boucle peut remplacer une longue ligne de test, puisque c'est plus encore qu'un simple usage de Ans. L'inconvénient de la remarque est qu'on peut s'en passer lorsqu'on a des listes.

D'autre part il n'y a pas que le poids qui compte, la vitesse peut aussi être améliorée selon l'usage de Ans ou non.

linkakro
Or 4
Or 4

Sexe : Masculin
Age : 22
Messages : 768
Date d'inscription : 01/07/2010
Etudes : dut geii (elec/info)
Points Forum : 51
Points Concours : 8
Langages :
  • - TI-Basic Z80
  • - ASM TI-82 Stats / TI-83
  • - ASM TI-83+ / TI-84+
Calculatrices :
  • - TI-82 Stats.fr
  • - TI-84 Pocket.fr

TI-84+ SE


Revenir en haut Aller en bas

Re: [Basic] Optimisation, bien utiliser Ans

Message par maxence le Mer 17 Avr - 12:59

J'ai édité le premier post, mais je n'ai pas encore fini. J'ai décidé de faire comme si je m'adressais à des débutants, donc je détail beaucoup plus que ce que je pensais, et ça me prend plus de temps que prévu.

Si vous avez des exemples, n'hésitez pas, ça me permet de me focaliser que sur la partie "Théorique" du tutoriel, parce que je n'ai pas trop d'idées pour la "pratique".

J'ai aussi supprimer la partie de la méthode "par liste", car je me suis aperçu qu'il était presque impossible de la rentabiliser Content

maxence
Or 4
Or 4

Sexe : Masculin
Age : 20
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :
  • - TI-Basic Z80
  • - Axe Parser
Calculatrices :
  • - TI-84+

TI-84+


Revenir en haut Aller en bas

Re: [Basic] Optimisation, bien utiliser Ans

Message par Invité le Lun 17 Juin - 15:34

Bravo Maxence, j'ai adoré ton tutoriel !
Je n'avais pas pensé à gagner des octets en utilisant la variable Ans !

Cependant, je l'ai quand même utilisée un peu dans Windows Calc 1.0 !

Invité
Invité


Revenir en haut Aller en bas

Re: [Basic] Optimisation, bien utiliser Ans

Message par maxence le Lun 17 Juin - 16:52

Merci, mais sache que je n'ai pas inventé cette méthode, j'ai juste cherhé à l'approfondir pour savoir quand elle était rentable.

Je dois avouer avoir un peu laché en cours de route, mais je suis motivé pour le continuer.
Pas demain parce que je passe mon bac d'histoire, ni après demain parce que c'est le bac de français, mais après j'aurais 10 jours avant mon oral, donc je pourais continuer.

En tous cas, je suis content que ça ai pu servir Clin Oeil

maxence
Or 4
Or 4

Sexe : Masculin
Age : 20
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :
  • - TI-Basic Z80
  • - Axe Parser
Calculatrices :
  • - TI-84+

TI-84+


Revenir en haut Aller en bas

Re: [Basic] Optimisation, bien utiliser Ans

Message par maxence le Mar 25 Juin - 10:33

Encore une fois désolé pour le double post, mais je suis bien obligé pour que ce soit vu ^^

J'ai avancé un peu, j'ai également corrigé quelques coquilles. Je compte faire la partie 4 prochainement, mais je suis un peu en manque d'exemples, je compte d'ailleurs rajouter quelques exemples également dans les parties précédentes.

Dîtes moi si vous voyez des choses à améliorer, à rajouter etc... Content

maxence
Or 4
Or 4

Sexe : Masculin
Age : 20
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :
  • - TI-Basic Z80
  • - Axe Parser
Calculatrices :
  • - TI-84+

TI-84+


Revenir en haut Aller en bas

Re: [Basic] Optimisation, bien utiliser Ans

Message par linkakro le Mar 25 Juin - 14:03

Corrige moi vite ce "booléns" de la partie 3 : booléens.
Je pense que celui qui ne connait pas encore le vocabulaire booléen retiendra mieux quand il saura que cela vient de Algèbre de Boole, le mathématicien.

Je ne comprend pas le but ni la cohérence des ces deux fragments. La boucle est toujours effectuée une fois, et dans ce cas un Repeat suffirait. Tandis que tu veux gérer autre chose d'après tes commentaires.
maxence a écrit:mais aussi qu'elle passe automatiquement si c'est la première boucle

:1
:While Ans
Moi j'affecterais une variable à zéro au début du programme, je stockerais cette variable dans Ans à chaque début de ce while, et j'affecterais cette variable à 1 après la boucle While.

Pense à Ans pour effectuer des sommes ou des produits de nombreuses variables, y compris pour leur équivalent booléen. C'est tellement pratique pour parcourrir des tableaux.

ps : Je pense reprendre tes phrases sur l'explication des booléen pour mon tuto sur les booléens (tout82), pas assez clair.

linkakro
Or 4
Or 4

Sexe : Masculin
Age : 22
Messages : 768
Date d'inscription : 01/07/2010
Etudes : dut geii (elec/info)
Points Forum : 51
Points Concours : 8
Langages :
  • - TI-Basic Z80
  • - ASM TI-82 Stats / TI-83
  • - ASM TI-83+ / TI-84+
Calculatrices :
  • - TI-82 Stats.fr
  • - TI-84 Pocket.fr

TI-84+ SE


Revenir en haut Aller en bas

Re: [Basic] Optimisation, bien utiliser Ans

Message par maxence le Mar 25 Juin - 19:13

Je corrigerais ça demain. Ceci dit je précise quand mêle qu'il faut que la boucle soit quittée en début si la condition est fausse, j'ai fait exprès pour qu'on repeat ne fasse pas l'affaire. Mais là n'est vraiment le but, c'était plus pour montrer le principe Clin Oeil

Je ne void pas présisement ou tu veux en venir avec les tableaux, si tu pouvais me donner un exemple pour que je l'intègre ça serait vraiment sympa Content

maxence
Or 4
Or 4

Sexe : Masculin
Age : 20
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :
  • - TI-Basic Z80
  • - Axe Parser
Calculatrices :
  • - TI-84+

TI-84+


Revenir en haut Aller en bas

Re: [Basic] Optimisation, bien utiliser Ans

Message par linkakro le Mar 25 Juin - 22:09

Quand tu dis "passe" ça veut dire évite la boucle ou execute le contenu ?
Soit évite : nous ne nous comprenons pas (moi pas ce que tu veux et toi pas mon paragraphe sous ma balise)
Soit execute : tout va bien

Ton second code de partie 3 et mon second code de mon second message ainsi que ce que j'ai désigné par tableau sont déjà des exemples de ma même pensée.
Exemples d'opération globale via des boucles qui se prètent à utiliser Ans.
Code:
While 1

1
For(A,1,3
For(B,1,3
Ans[A](A,B
End
End
If Ans
Disp "CONTIENT PAS 0

End
Code:
While 1

0
For(A,1,3
For(B,1,3
Ans ou [A](A,B
End
End
If Ans
Disp "CONTIENT AU MOIN","UN NON-NUL

End
Si on prend une liste au lieu d'une matrice, on peut souvent se passer de cette méthode en préférant les fonctions de liste.

linkakro
Or 4
Or 4

Sexe : Masculin
Age : 22
Messages : 768
Date d'inscription : 01/07/2010
Etudes : dut geii (elec/info)
Points Forum : 51
Points Concours : 8
Langages :
  • - TI-Basic Z80
  • - ASM TI-82 Stats / TI-83
  • - ASM TI-83+ / TI-84+
Calculatrices :
  • - TI-82 Stats.fr
  • - TI-84 Pocket.fr

TI-84+ SE


Revenir en haut Aller en bas

Re: [Basic] Optimisation, bien utiliser Ans

Message par Contenu sponsorisé Aujourd'hui à 6:49


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum