Utilisation du mode "constante". Sur 602P la séquence
5 * *
1 = donne 5
2 = donne 10
5 = donne 25
Idem avec tout autre opérateur et çà marche en programme
Plus le tordu SIN(23) qui gagne un pas sur 9/23 ... Si si !
2 10^x gagne un pas sur 100
et autres astuces expliquées plus haut
Même principe de saisie que C.RET
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Gilles59 a écrit :Bon on se fait encore avoir à Noel et Nouvel an
On le savait déjà depuis le mois de Mai !
Quelle que soit l'année, 1er Mai, 8 Mai, 25 Décembre et 1er Janvier de l'année suivante tombent le même jour de la semaine. Cette année, pas de bol, c'est un dimanche. L'année prochaine, c'est un mardi... on va pouvoir jouer du viaduc !
Je viens (enfin) de comprendre l'intéret du sin(23) ! JE comprends vite, mais il faut ... m'expliquer longtemps.
En effet, 9/23 ~ 0.39130 et sin 23° ~ 0.39073. Ces deux valeur sont uffisamment proches pour que le calcul soit valide sur quelques millènaires !
Je viens (enfin) de comprendre l'intéret du sin(23) ! JE comprends vite, mais il faut ... m'expliquer longtemps.
En effet, 9/23 ~ 0.39130 et sin 23° ~ 0.39073. Ces deux valeur sont uffisamment proches pour que le calcul soit valide sur quelques millènaires !
J'avoue que c'est tordu...
.39 ferait 3 pas aussi mais pas assez précis (j'ai contrôlé vite fait, faut voir)
.391 fait un pas de plus comme 9/23
Vu l'algo, si çà marche sur un an, çà marche toujours...
Faut juste vérifier que çà donne bien la même chose que Int(mois*23/9) pour les 12 valeurs possibles
Apres vérif, .39 semble suffisant comme précision... Donc virons le SIN. Ca ne raccourcit pas mais c'est moins exotique
Un autre pas évident gagné par ailleurs, soit 44 pas
Désolé de déterrer ce Thread aussi ancien, mais j'ai pas pu m’empêcher de faire ce petit programme pour ma HP.
Ci-joint donc le prog RPL pour HP28S/48/49/50
«
DUP IP SWAP FP 100 * DUP IP SWAP FP 100 * SWAP ROT
IF OVER 3 < THEN DUP 1 - ELSE DUP 2 - SWAP END
DUP 4 / IP OVER 100 / IP - SWAP 400 / IP + + 4 +
SWAP 23 * 9 / IP + + 7 MOD IP 1 +
{"Dimanche" "Lundi" "Mardi" "Mercredi"
"Jeudi" "Vendredi" "Samedi" } SWAP GET
»
Programme qui peut etre optimisé si on saisi directement la date dans la pile de cette manière:
3: 15
2: 2
1: 2013
00 32 0 STO 0 Z dans 0
01 32 2 STO 1 Y dans 1 (1 contient J, la valeur finale)
02 81 R/S
03 32 7 STO 7 M dans 7
04 81 R/S
05 34 1 SUM 1 D est ajouté à J=Y+D
06 02 2
07 76 x=>t 2 = > M ?
08 56 Dsz Non -> Z=Z-1 ; Oui -> Z est laissé tel quel
09 76 x=>t 2 = > M ?
10 00 0 non -> W=0 ; Oui, 2 est laissé tel quel -> W=2
11 -34 1 INV SUM 1 qui est enlevé à J=Y+D-W
12 02 2
13 03 3
14 39 7 Prd 7
15 09 9
16 -37 7 INV Prd 7 7 contient M*23/9
17 33 7 RCL 7
18 49 Int
19 34 1 SUM 1 J=INT(M*23/9)+Y+D-W
20 04 4
21 34 1 SUM 1 4 est ajouté à J=INT(M*23/9)+Y+D+4-W
22 38 0 Exc 0 4 bascule dans 0 et Z est récupéré en échange...
23 32 3 STO 3 ...qui est mis dans 3
24 89 INV X INV "moyenne de X" <=> "RCL 3 / RCL 0 =" -> Z/4
25 49 Int INT (Z/4)
26 34 1 SUM 1 qui est ajouté à J=INT(M*23/9)+Y+D+4+INT(Z/4)-W
27 33 3 RCL 3 Z
28 45 /
29 02 2
30 -18 INV Log = 100
31 39 0 Prd 0 0 contient désormais 400
32 85 = Z/100
33 49 Int INT (Z/100)
34 -34 1 INV SUM 1 Ôté à J=INT(M*23/9)+Y+D+4+INT(Z/4)-INT(Z/100)-W
35 89 INV X INV "moyenne de X" -> Z/400
36 49 Int INT (Z/400)
37 34 1 SUM 1 Ajouté à J=INT(M*23/9)+Y+D+4+INT(Z/4)-INT(Z/100)+INT(Z/400)-W
38 07 7
39 32 0 STO 0 7 dans 0
40 -89 X "Moyenne de X" <=> "RCL 1 / RCL 0 =" -> J/7
41 49 INT INT(J/7)
42 39 0 Prd 0 0 contient INT(J/7)*7
43 32 0 RCL 0 INT(J/7)*7
44 -34 1 INV SUM 1 1 contient J-INT(J/7)*7=J MOD 7
45 33 1 RCL 1 Tada !...
46 81 R/S Ouf, c'est fini.
RST, saisir l'année, R/S, le mois, R/S, le jour, R/S -> 0 =Dimanche, 1=Lundi etc...
Qui dit mieux ?
Gilles59 a écrit :Plus le tordu SIN(23) qui gagne un pas sur 9/23 ... Si si !
Arf... pas vraiment lossless ta compression ... en audio c'est négligeable, mais faire du MP3 sur une formule de maths, c'est quand-même dangereux
gilleslp a écrit :50 J=((23*M/9)+D+4+Y+(Z/4)-(Z/100)+(Z/400)-W) MOD 7
Attention : il manque les fonctions INT(
-> 50 J=(INT(23*M/9)+D+4+Y+INT(Z/4)-INT(Z/100)+INT(Z/400)-W) MOD 7
Modifié en dernier par leglatin le 30 juil. 2017 14:00, modifié 1 fois.
leglatin a écrit : Excellent exercice d'optimisation sur TI-57, voici ma proposition (Algo de Mike Keith) :
RST, saisir l'année, R/S, le mois, R/S, le jour, R/S -> 0 =Dimanche, 1=Lundi etc...
Qui dit mieux ?
Je cherchais moi-aussi une solution sur TI-57, et ça a fini par tenir en 48 pas, mais en rentrant toutes les constantes et variables hors-programme et en me passant du test sur le mois.
Ta solution m'émerveille par son élégance, et je reste ébahi par le nombre d'astuces employées, en particulier l'emploi des fonctions statistiques pour effectuer des opérations sur les registres-mémoire:
...
24 89 INV X INV "moyenne de X" <=> "RCL 3 / RCL 0 =" -> Z/4
...
40 -89 X "Moyenne de X" <=> "RCL 1 / RCL 0 =" -> J/7
...
Y a-t-il d'autres astuces pour l'emploi détourné des fonctions statistiques? Un lien vers de la doc (le manuel de la TI-57 est muet à ce sujet...)? J'ai encore beaucoup à apprendre sur la TI-57...
Bravo en tout cas! (et merci pour avoir pris la peine de commenter abondamment ton listing!)
Merci pour tes compliments et en effet, il faut des astuces pour réussir à entrer un programme aparemment impossible à injecter dans la TI-57... J'avais lu l'astuce des moyenne de x dans un numéro de l'OP et depuis, je m'en passe guère. Autres exemples d'astuces : si on a un nombre >1 dans la mémoire 0, et qu'on veuille faire RCL 0, -, 1, =, STO 0, en fait un simple Dsz fera la même chose -> on gagne 4 pas. Si on veut RCL 0, X, 2, =, STO 0, mieux vaut faire RCL 0, SUM 0 -> on gagne 3 pas etc...
En fait pour dénicher des astuces, il faut voir ce que fait exactement une instruction, et non pas se focaliser sur le pourquoi elle a été conçue.
leglatin a écrit :Merci pour tes compliments et en effet, il faut des astuces pour réussir à entrer un programme aparemment impossible à injecter dans la TI-57... J'avais lu l'astuce des moyenne de x dans un numéro de l'OP et depuis, je m'en passe guère. Autres exemples d'astuces : si on a un nombre >1 dans la mémoire 0, et qu'on veuille faire RCL 0, -, 1, =, STO 0, en fait un simple Dsz fera la même chose -> on gagne 4 pas. Si on veut RCL 0, X, 2, =, STO 0, mieux vaut faire RCL 0, SUM 0 -> on gagne 3 pas etc...
En fait pour dénicher des astuces, il faut voir ce que fait exactement une instruction, et non pas se focaliser sur le pourquoi elle a été conçue.
Merci!
Grâce à toi, j'ai pu enfin faire entrer le calcul du Jour Julien (proche de celui du jour de la semaine) dans une TI-57, ce que je considérais jusqu'à présent comme impossible. Le Jour Julien permet de numéroter toutes les dates depuis le 1er janvier -4712 à 12 heures, sans ce soucier, des années, des mois, des jours. C'est un calcul important en astronomie.
Évidemment, j'ai dû me limiter aux dates du calendrier grégorien (à partir du 15 octobre 1582), et entrer manuellement, avant l'exécution du programme, 3 constantes.
Mon programme ne répond pas directement au "Misez p'tit, Optimisez - n°12", mais il me semble une suite logique du programme de leglatin... Il a été testé avec l'émulateur go57c sur Android. (désolé pour les décalages de la mise en page, le code était pourtant bien aligné dans mon fichier source .txt)
Il y a sans doute possibilité de grappiller encore quelques pas, mais l'essentiel est là: ça rentre dans la vieille TI-57!
TI-57
Calcul du Jour Julien
pour toute date du calendrier grégorien
(postérieure au 15/10/1582)
---------------------------------------
Rappel algorithme (Meeus, "Calculs astronomiques à l'usage des amateurs")
-----------------
Cet algorithme est simplifié, puisqu'on n'utilise que le calendrier grégorien
1. Si mois<3, y=année-1 et m=mois+12, sinon y=année et m=mois.
2. A=ent(y/100):B=2-A+ent(A/4)
3. JJ=ent(365.25*y)+ent(30.6001*(m+1))+jour+1720994.5+B
Avant la 1ère exécution:
-----------------------
1720994.5 STO 4
30.6001 STO 5
365.25 STO 6
Mode d'emploi:
-------------
RST
Année (AAAA) R/S
Mois (M) R/S
Jour (J.FJ) R/S -> FJ=fraction de jour. Ex: 21.75 = le 21 à 18hTU
Astuces employées (merci leglatin!):
-----------------------------------
- fonction statistique mean (x surmonté d'un trait): "RCL 1/RCL0 =" (1 pas au lieu de 4)
- Dsz: décrémente le registre 0 de 1 (1 pas au lieu de "RCL0 - 1 = ")
- 2 INV 2nd log = 100 (2 pas au lieu de 3)
- le registre 2 sert à additionner les différentes parties de la formule du jour julien
LISTING commenté:
----------------
pas code instruction commentaire
---------------------------------------------
00 32 0 STO 0 Année dans registre 0
01 33 4 RCL 4 1720994.5
02 32 2 STO 2 JJ=1720994.5
03 03 3
04 22 x<->t 3 dans registre test
05 81 R/S Entrée mois
06 32 3 STO 3 mois dans registre 3
07 76 x>=t le mois est-il >= 3?
08 51 0 GTO 0 oui: ne rien faire (aller au label 0)
09 56 Dsz instruction détournée! Dsz décrémente le registre 0 de 1 = y=année-1
10 01 1
11 02 2
12 34 3 SUM 3 m=m+12
13 86 0 LBL 0 suite du pgm
14 81 R/S Entrée Jour =J.FJ (voir mode d'emploi)
15 34 2 SUM 2 JJ=J.FJ+1720994.5
16 02 2 2
17 -18 INV log 2 INV 2nd log = 100
18 38 0 Exc 0 100 dans registre 0 (diviseur), y à l'affichage
19 32 1 STO 1 y dans registre 1 (nb à diviser)
20 89 (mean) fonction statistique: x surmonté d'un trait = "RCL 1/RCL 0 ="
21 49 Int Int(y/100)
22 32 7 STO 7 A=Int(y/100) stocké dans registre 7
23 02 2
24 32 0 STO 0 B=2-A+Int(A/4): formule calculée dans registre 0
25 33 7 RCL 7 A
26 -34 0 INV SUM 0 2-A
27 45 /
28 04 4 A/4
29 85 =
30 49 Int Int(A/4)
31 34 0 SUM 0 B=2-A+Int(A/4)
32 33 0 RCL 0
33 34 2 SUM 2 JJ=J.FJ+1720994.5+B
34 33 6 RCL 6 365.25
35 39 1 Prd 1 365.25*y
36 33 1 RCL 1
37 49 Int Int(365.25*y)
38 34 2 SUM 2 JJ=Int(365.25*y)+J.FJ+1720994.5+B
39 01 1
40 34 3 SUM 3 m+1
41 33 5 RCL 5 30.6001
42 39 3 Prd 3 30.6001*(m+1)
43 33 3 RCL 3
44 49 Int Int(30.6001*(m+1))
45 34 2 SUM 2 JJ=Int(365.25*y)+Int(30.6001*(m+1))+J.FJ+1720994.5+B
46 33 2 RCL 2
47 81 R/S Affichage JJ (ouf!)