[Basic] Optimisation, bien utiliser Ans
4 participants
Page 1 sur 1
[Basic] Optimisation, bien utiliser Ans
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
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 !
- 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
- Sexe :
Age : 28
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :- - TI-Basic Z80
- - Axe Parser
- - TI-84+
Re: [Basic] Optimisation, bien utiliser Ans
c'est pas mal comme tutoriel !
ca m'a un peu aidee meme, continue le bien car ans est une belle optimisation
ca m'a un peu aidee meme, continue le bien car ans est une belle optimisation
nikitouzz- Platinum 1
- Sexe :
Age : 29
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
- - TI-73
- - TI-76.fr
- - TI-82 Stats.fr
- - TI-83+
- - TI-84+
- - TI-92
- - TI-Nspire
- - TI-Nspire CX
Re: [Basic] Optimisation, bien utiliser Ans
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.
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
- Sexe :
Age : 30
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+
- - TI-82 Stats.fr
- - TI-84 Pocket.fr
Re: [Basic] Optimisation, bien utiliser Ans
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
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
- Sexe :
Age : 28
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :- - TI-Basic Z80
- - Axe Parser
- - TI-84+
Re: [Basic] Optimisation, bien utiliser Ans
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.
en tout cas ca va beaucoup m'aidée pour la programmation en basic.
nikitouzz- Platinum 1
- Sexe :
Age : 29
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
- - TI-73
- - TI-76.fr
- - TI-82 Stats.fr
- - TI-83+
- - TI-84+
- - TI-92
- - TI-Nspire
- - TI-Nspire CX
Re: [Basic] Optimisation, bien utiliser Ans
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
En tout cas j'espère que ça pourra en aider quelque uns
maxence- Or 4
- Sexe :
Age : 28
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :- - TI-Basic Z80
- - Axe Parser
- - TI-84+
Re: [Basic] Optimisation, bien utiliser Ans
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.
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
- Sexe :
Age : 30
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+
- - TI-82 Stats.fr
- - TI-84 Pocket.fr
Hayleia- Or 4
- Age : 30
Messages : 406
Date d'inscription : 03/08/2012
Points Forum : 46
Points Concours : 4
Langages :- - TI-Basic Z80
- - Axe Parser
- - TI-76.fr
- - TI-83+
- - TI-84+ SE
- - TI-Nspire CX
Re: [Basic] Optimisation, bien utiliser Ans
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.
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
- Sexe :
Age : 30
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+
- - TI-82 Stats.fr
- - TI-84 Pocket.fr
Re: [Basic] Optimisation, bien utiliser Ans
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
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
maxence- Or 4
- Sexe :
Age : 28
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :- - TI-Basic Z80
- - Axe Parser
- - TI-84+
Re: [Basic] Optimisation, bien utiliser Ans
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 !
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é
Re: [Basic] Optimisation, bien utiliser Ans
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
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
maxence- Or 4
- Sexe :
Age : 28
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :- - TI-Basic Z80
- - Axe Parser
- - TI-84+
Re: [Basic] Optimisation, bien utiliser Ans
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...
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...
maxence- Or 4
- Sexe :
Age : 28
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :- - TI-Basic Z80
- - Axe Parser
- - TI-84+
Re: [Basic] Optimisation, bien utiliser Ans
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.
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.
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.
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.maxence a écrit:mais aussi qu'elle passe automatiquement si c'est la première boucle
:1
:While Ans
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
- Sexe :
Age : 30
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+
- - TI-82 Stats.fr
- - TI-84 Pocket.fr
Re: [Basic] Optimisation, bien utiliser Ans
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
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
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
maxence- Or 4
- Sexe :
Age : 28
Messages : 574
Date d'inscription : 26/02/2012
Etudes : 1ere S SI
Points Forum : 17
Points Concours : 0
Langages :- - TI-Basic Z80
- - Axe Parser
- - TI-84+
Re: [Basic] Optimisation, bien utiliser Ans
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.
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
linkakro- Or 4
- Sexe :
Age : 30
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+
- - TI-82 Stats.fr
- - TI-84 Pocket.fr
Sujets similaires
» utiliser des sprites en Basic: mission impossible ?
» Token IDE: logiciel de dévellopement de Basic étendu (Basic, Axe, Grammer, Celtic, Xlib, Omnicalc, DoorcsCS7)
» [Z80]Utiliser calcsys.
» Astuce : utiliser l'indentation
» Optimisation: 0,62,0,94
» Token IDE: logiciel de dévellopement de Basic étendu (Basic, Axe, Grammer, Celtic, Xlib, Omnicalc, DoorcsCS7)
» [Z80]Utiliser calcsys.
» Astuce : utiliser l'indentation
» Optimisation: 0,62,0,94
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum