Misez p'tit, Optimisez - N°12

Ici, on fait dans le petit, le LCD qui déchire sa race, on y cause même calculatrices quand on est en manque !

Modérateur : Politburo

Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Misez p'tit, Optimisez - N°12

Message par Gilles59 »

Sans utiliser les fonctions de calculs de dates si elle existent, trouver le jour de la semaine à partir d'une date ( L Ma Me J V S D).
La date sur la pile (RPN) ou en entrée sera sous la forme année.mmjj par ex 2010.1201 ou 1789.0714 pour le 14 juillet 1789

Par exemple le 2011.1111 était un vendredi. Que sera le 2012.1212 ?

Votre programme devra fonctionner à minima à partir du 15 octobre 1582, date de Rome.
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
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Misez p'tit, Optimisez - N°12

Message par Gilles59 »

Algo trouvé sur le net.

Casio FX-602P, 67 pas
Devrait être plus compact en RPN et mchine avec des STO/ et STO* et MOD

Code : Tout sélectionner

- INT Min1F Min00 =
x 100 - INT MinF =
x 100 = M+1F

23 x MRF / 9 = INT M+1F
2 x>=F DSZ x>=F 0 M-1F
MR00 / 4 M+1F = INT M+1F
MR00 / 100    = INT M-1F
MR00 / 400    = INT M+1F

MR1F / 7 = FRAC * 7 = FIX8 
0 -> Dimanche ... 6 -> Samedi

2011.1111 -> 5 (Vendredi)
1900.0101 -> 1 (Lundi)
2012.12.12 -> 3 (Me)

EDIT : je me demande si çà rentrerait pas dans une TI57 au chausse pied et mettant certains nombres en STO
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
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Misez p'tit, Optimisez - N°12

Message par Gilles59 »

Avoir le jour de la semaine est une commande RPL native, mais si on essaie de réécrire :

Déjà pour commencer, pour que 2011.1109 donne

2011
11
09

sur la pile en RPL (50G)

j'aime bien :

Code : Tout sélectionner

{ DUP IP SWAP FP 100 * } DUP + EVAL
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
Avatar du membre
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3626
Enregistré le : 06 sept. 2011 14:57
Localisation : Normandie

Re: Misez p'tit, Optimisez - N°12

Message par Hobiecat »

Gilles59 a écrit :Algo trouvé sur le net.

Casio FX-602P, 67 pas
Devrait être plus compact en RPN et mchine avec des STO/ et STO* et MOD

Code : Tout sélectionner

- INT Min1F Min00 =
x 100 - INT MinF =
x 100 = M+1F

23 x MRF / 9 = INT M+1F
2 x>=F DSZ x>=F 0 M-1F
MR00 / 4 M+1F = INT M+1F
MR00 / 100    = INT M-1F
MR00 / 400    = INT M+1F

MR1F / 7 = FRAC * 7 = FIX8 
0 -> Dimanche ... 6 -> Samedi

2011.1111 -> 5 (Vendredi)
1900.0101 -> 1 (Lundi)
2012.12.12 -> 3 (Me)

EDIT : je me demande si çà rentrerait pas dans une TI57 au chausse pied et mettant certains nombres en STO
J'essaie sur la 15C, mais c'est compliqué si on veut n'utiliser que la pile....

J'aime bien l'utilisation astucieuse du 4 en double dans le programme ci-dessus ! Par contre, n'y a t'il pas un problème d'algorithme ? Ceux que j'ai trouvé demandent l'année pour toutes les divisions par 4, 100 et 400 si le mois est postérieur à mars, mais l'année moins 1 si le mois est janvier ou février (pour compenser les années bissextiles) : je ne vois pas cette subtilité dans le programme, mais je ne suis pas expert en 602P !
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Misez p'tit, Optimisez - N°12

Message par Gilles59 »

Hobiecat a écrit :J'essaie sur la 15C, mais c'est compliqué si on veut n'utiliser que la pile....

J'aime bien l'utilisation astucieuse du 4 en double dans le programme ci-dessus ! Par contre, n'y a t'il pas un problème d'algorithme ? Ceux que j'ai trouvé demandent l'année pour toutes les divisions par 4, 100 et 400 si le mois est postérieur à mars, mais l'année moins 1 si le mois est janvier ou février (pour compenser les années bissextiles) : je ne vois pas cette subtilité dans le programme, mais je ne suis pas expert en 602P !
Bjr, je me suis basé sur cela :
Dans un article publié en 1990 dans le Journal of Recrational Mathematics, Vol. 22, No. 4, 1990, p. 280, Mike Keith propose un algorithme pour la détermination du jour de la semaine correspondant à une date quelconque. Sa formule, inspirée de la congruence de Zeller et traduite en seulement 45 caractères précise-t-il, est la suivante :

Code : Tout sélectionner

 (d+=m<3?y--:y-2, 23*m/9 + d + 4 + y/4 -y/100 + y/400) ÷ 7 
Mike Keith déclare lui-même qu'il s'agit là de la " plus simple formule possible " pour le calcul du jour de la semaine, " la meilleure qui puisse être construite ", ajoute-t-il. Dans sa forme opérationnelle, son algorithme s'écrit :

Code : Tout sélectionner

Jour de semaine D = { [(23m)/9] + d + 4 + y + [z/4] - [z/100] + [z/400] - 2 (si m >= 3) } mod 7
où:
D = Jour de semaine   (D = 0 à 6;   0 = Dimanche, 1 = Lundi, ... , 6 = Samedi)
[x] signifie le nombre entier résultant de la division, le reste étant ignoré
m = Mois   (m = 1 à 12;   1 = Janvier, 2 = Février, 3 = Mars, ... , 12 = Décembre)     m >= 3 signifie m supérieur ou égal à 3
d = Jour   (d = 1 à 31)
y = année
z = y - 1   si m < 3
z = y       si m >= 3
Modulo 7 ou mod 7 = reste de la division par 7  
http://cosmos2000.chez.com/Vendredi13/M ... thode.html

Je me suis basé sur la seconde formulation car je ne comprends pas la premiere ... (mais il y a peut-être à gagner car je ne suis pas sur que la seconde formulation corresponde vraiment à la première (? quid des parties entières ? du modulo ? )

Apres quelques vérifs mais sommaires (!) , le prog 602P semble correct

Dans ce prog il y a aussi une astuce sur :

Code : Tout sélectionner

2 x>=F DSZ x>=F 0 M-1F
qui permet de calculer "z" et "- 2 (si m >= 3)" en même temps si j'ose dire.
Le DSZ gére la question des mois <=2 ou supérieur
DSZ décrémente la mémoire MR00 et saute le pas suivant si MR00=0 (ce qui n'arrive jamais ici car l'année ne peut pas être =1)

Code : Tout sélectionner

MR1F : Année puis progressivement jour de la semaine
MR00 : Si Mois < 3 alors (Année - 1)  sinon Année
MRF  : Mois
On peut gagner 8 pas en stockant manuellement 100 et 400 dans des mémoires

EDIT : Sur une TI57, si on demande de saisir année , mois , jour en 3 fois, c'est jouable, puisque ca réduit à 52 pas sur la 602P et la TI57 a des commandes ST* et ST/ il me semble

Code : Tout sélectionner

Min1F Min00 HALT MinF HALT M+1F

23 x MRF / 9 = INT M+1F
2 x>=F DSZ x>=F 0 M-1F
MR00 / 4 M+1F = INT M+1F
MR00 / 100    = INT M-1F
MR00 / 400    = INT M+1F

MR1F / 7 = FRAC * 7 = FIX8 
[/size]
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
Avatar du membre
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3626
Enregistré le : 06 sept. 2011 14:57
Localisation : Normandie

Re: Misez p'tit, Optimisez - N°12

Message par Hobiecat »

Gilles59 a écrit :Dans ce prog il y a aussi une astuce sur :

Code : Tout sélectionner

2 x>=F DSZ x>=F 0 M-1F
qui permet de calculer "z" et "- 2 (si m >= 3)" en même temps si j'ose dire.
Le DSZ gére la question des mois <=2 ou supérieur
DSZ décrémente la mémoire MR00 et saute le pas suivant si MR00=0 (ce qui n'arrive jamais ici car l'année ne peut pas être =1)
C'est là que je ne trouvais pas le -1 !
Bon j'ai fini sur la 15C, mais pas très optimisé (72 "lignes")... je recopie le code ce soir si j'ai le temps ! :wink:

Edit : une version 15c pas très optimisée, mais sur la pile uniquement (et juste un petit flag :mrgreen: )

Code : Tout sélectionner

LBL 0
CF 0       Flag à 0
INT        Décomposition de la date sur les registres x, y et z
LAST x
FRAC
100
*
INT
LAST x
FRAC
100             
*
x<>y
3          Vérification si le mois >=3 et si oui flag 0 
x<=y?
SF 0
Rdown      Début calcul de date (partie entre parenthèses)
23
*
9
/
INT
+
+
4
+
FS 0?      Gestion du cas m>=3 alors -2 sinon 0
GTO 1
2
+
LBL 1
2
-
x<>y
FS 0?      Gestion de z=y-1 ou z=y suivant m>=3
GTO 2
1
-
LBL 2
ENTER
ENTER
4
/
INT
x<>y
100
/
INT
-
x<>y
400
/
INT
+
+          Fin du calcul entre parenthèses
7          Calcul du modulo pour obtenir le jour
/
FRAC
7
*
RTN
On doit pouvoir faire mieux...
Modifié en dernier par Hobiecat le 15 nov. 2011 14:52, modifié 2 fois.
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Misez p'tit, Optimisez - N°12

Message par Gilles59 »

Hobiecat a écrit : Bon j'ai fini sur la 15C, mais pas très optimisé (72 "lignes")... je recopie le code ce soir si j'ai le temps ! :wink:

Edit : une version 15c pas très optimisée, mais sur la pile uniquement (et juste un petit flag :mrgreen: )
...
On doit pouvoir faire mieux...
En tout cas c'est trés 'propre' même pour moi qui ne maitrise pas trop le RPN

J'ai essayé sur un TI66 mais j'ai vraiment du mal avec cette machine 8O
En RPL, on peut refaire pas à pas le prg RPN avec des IFT à la place des GTO

Tu n'as pas des pb d'arrondi parfois genre 2.99999 au lieu de 3 ?
C'est pour çà que je mets un FIX8 à la fin

Sinon on peux faire en 63 pas sur 602P mais avec une mémoire en plus et 2 10^x ( 2 pas à la place de 3 pas pour 100).

Code : Tout sélectionner

- INT Min1F Min00 =
x 2 10^x Min01  - INT MinF =
x MR01 = M+1F

23 x MRF / 9 = INT M+1F
2 x>=F DSZ x>=F 0 M-1F
MR00 / 4 M+1F = INT M+1F
MR00 / MR01   = INT M-1F
MR00 / 400    = INT M+1F

MR1F / 7 = FRAC * 7 = FIX8
Et même 58 pas en devenant un peu pervers :twisted:

Code : Tout sélectionner

***P9 = INT M+1F

***P0
- INT Min1F Min00 =
x 2 10^x Min01  - INT MinF =
x MR01 GSBP9

23 x MRF / 9 GSBP9
2 x>=F DSZ x>=F 0 M-1F
MR00 / 4 M+1F    GSBP9
MR00 / MR01  +/- GSBP9
MR00 / 400       GSBP9

MR1F / 7 = FRAC * 7 = RND1
Modifié en dernier par Gilles59 le 14 nov. 2011 22:38, modifié 1 fois.
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
Avatar du membre
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3626
Enregistré le : 06 sept. 2011 14:57
Localisation : Normandie

Re: Misez p'tit, Optimisez - N°12

Message par Hobiecat »

Gilles59 a écrit :En RPL, on peut refaire pas à pas le prg RPN avec des IFT à la place des GTO
Pas d'avis sur les RPL, ce sont celles que je ne maîtrise pas ! :wink: Par contre, sur la 41, on doit pouvoir faire mieux en bénéficiant de l'accès direct à la pile avec STO et RCL.
Tu n'as pas des pb d'arrondi parfois genre 2.99999 au lieu de 3 ?
C'est pour çà que je mets un FIX8 à la fin
J'ai fait pas mal d'essais, mais uniquement sur 2011 parce que j'avais le calendrier sous les yeux : je n'ai pas vu ce genre de problème d'arrondi... La 15C serait-elle plus précise que la 602P ? :mrgreen:
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Misez p'tit, Optimisez - N°12

Message par Gilles59 »

Hobiecat a écrit :
Gilles59 a écrit :En RPL, on peut refaire pas à pas le prg RPN avec des IFT à la place des GTO
Pas d'avis sur les RPL, ce sont celles que je ne maîtrise pas ! :wink:
DUP à place de ENTER, SWAP à la place de X<>Y, IP pour INT, FP pour FRAC et 2 3 bricoles !
Par contre, sur la 41, on doit pouvoir faire mieux en bénéficiant de l'accès direct à la pile avec STO et RCL.
Probablement. Sur 15C tu peux bien raccourcir en utilisant des mémoires je pense (c gruger :?: :twisted: )
Tu n'as pas des pb d'arrondi parfois genre 2.99999 au lieu de 3 ?
C'est pour çà que je mets un FIX8 à la fin
J'ai fait pas mal d'essais, mais uniquement sur 2011 parce que j'avais le calendrier sous les yeux : je n'ai pas vu ce genre de problème d'arrondi... La 15C serait-elle plus précise que la 602P ? :mrgreen:
Je sais pas mais sur 602P ca me le fait. J'ai remplacé le FIX8 par RND1, 1 pas de gagné (FIX est une des très rare (la seule ?) instruction qui prend 2 pas )
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
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Misez p'tit, Optimisez - N°12

Message par Gilles59 »

En 55 pas, mode fou furieux et degré comprenne qui peut :

Code : Tout sélectionner

***P9 1/x = INT M+1F

***P0
- INT Min1F Min00 =
* 2 10^x Min01  - INT MinF =
/ MR01 GSBP9

MRF * 23 SIN GSBP9
2 x>=F DSZ x>=F 0 M-1F
MR00 * * 
4 M+1F    GSBP9
MR01  +/- GSBP9
400       GSBP9

MR1F / 7 = FRAC * 7 = RND1
j'ai remis des '*' pour le signe 'multiplier' à la place du 'x' de la 602P, c'est plus clair
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
Avatar du membre
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3626
Enregistré le : 06 sept. 2011 14:57
Localisation : Normandie

Re: Misez p'tit, Optimisez - N°12

Message par Hobiecat »

Oups, en essayant d'écrire la pile pour voir les optimisations possibles, je me suis rendu compte d'un bug dans ma version précédente... :oops:

Ci-dessous la version corrigée, avec la pile en prime du coup :

Code : Tout sélectionner

        x            y         z        t

LBL 0   2011.1111	
CF 0    2011.1111   
INT     2011   
LAST x  2011.1111    2011
FRAC    .1111        2011
100     100          .1111     2011
*       11.11        2011
INT     11           2011
LAST x  11.11        11        2011
FRAC    .11          11        2011
100     100          .11       1120     11        
*       11           11        2011     2011
x<>y    11           11        2011     2011
3       3            11        11       2011
x<=y?   3            11        11       2011
SF 0    3            11        11       2011	
Rdown   11           11        2011     3   
23      23           11        11       2011
*       253          11        2011     2011
9       9            253       11       2011
/       28.11111111  11        2011     2011
INT     28           11        2011     2011
+       39           2011      2011     2011
+       2050         2011      2011     2011
4       4            2050      2011     2011
+       2054         2011      2011     2011
FS 0?   2054         2011      2011     2011   
GTO 1   2054         2011      2011     2011
2       				
+
LBL 1   2054         2011      2011     2011
2       2            2054      2011     2011
-       2052         2011      2011     2011
x<>y    2011         2052      2011     2011	
FS 0?   2011         2052      2011     2011   	
GTO 2   2011         2052      2011     2011
1
-
LBL 2   2011         2052      2011     2011
ENTER   2011         2011      2052     2011
ENTER   2011         2011      2011     2052
4       4            2011      2011     2052		
/       502.75       2011      2052     2052
INT     502          2011      2052     2052
Rup     2052         502       2011     2052
+       2554         2011      2052     2052		
x<>y    2011         2554      2052     2052
ENTER   2011         2011      2554     2052
ENTER   2011         2011      2011     2554
100     100          2011      2011     2554					
/       20.11        2011      2554     2554
INT     20           2011      2554     2554
CHS     -20          2011      2554     2554
x<>y    2011         -20       2554     2554
400     400          2011      -20      2554
/       5.0275       -20       2554     2554
INT     5            -20       2554     2554
+       -15          2554      2554     2554
+       2539         2554      2554     2554
7       7            2554      2554     2554   
/       362.7142857  2554      2554     2554
FRAC    .7142857     2554      2554     2554
7       7            .7142857  2554     2554		
*       5            2554      2554     2554
RTN
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit, Optimisez - N°12

Message par C.Ret »

Désolé, je n'ai pas eut de temps à consacrer à cet interessant excercice.
En plus je suis en déplacement sans matériel ad'hoc.

Vous avez bien avancé.
En RPN, je constate qu'il y a pas moins de 15 pas pour transformer la date x: aaaa.mmjj et la mettre dans la pile. De plus cela occupe ensuite les 3/4 de la pile, heureusement que très vite l'addition du quantum journalier (jj) fait gagner de la place.

Ma réflexion est donc, pourquoi ne pas demander à l'utilisateur de placer les élément de la date directemetn dans la pile; du genre
z:aaa y:mm et x:jj ou plus naturellement pour nous z:jj y:mm et x:aaaa ? Plus naturel car la date serait saiie dans l'ordre
[RTN]16 [ENTER] 11 [ENTER] 2011 [R/S]?

Mais cela prend toujours les 3/4 de la pile. Donc, je me demandais si un code qui calcule et s'arrête pour demander la date en trois partie est recevable ? Du style [RTN] 16 [R/S] 11 [R/S] 2011 [R/S] affiche "MER"
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3626
Enregistré le : 06 sept. 2011 14:57
Localisation : Normandie

Re: Misez p'tit, Optimisez - N°12

Message par Hobiecat »

C.Ret a écrit :Vous avez bien avancé.
En RPN, je constate qu'il y a pas moins de 15 pas pour transformer la date x: aaaa.mmjj et la mettre dans la pile. De plus cela occupe ensuite les 3/4 de la pile, heureusement que très vite l'addition du quantum journalier (jj) fait gagner de la place.

Ma réflexion est donc, pourquoi ne pas demander à l'utilisateur de placer les élément de la date directemetn dans la pile; du genre
z:aaa y:mm et x:jj ou plus naturellement pour nous z:jj y:mm et x:aaaa ? Plus naturel car la date serait saiie dans l'ordre
[RTN]16 [ENTER] 11 [ENTER] 2011 [R/S]?

Mais cela prend toujours les 3/4 de la pile. Donc, je me demandais si un code qui calcule et s'arrête pour demander la date en trois partie est recevable ? Du style [RTN] 16 [R/S] 11 [R/S] 2011 [R/S] affiche "MER"
Oui on peut, mais pour la version RPN, je me suis plié à la régle définie par Gilles !

Si j'avais le choix pour mon programme RPN, je mettrais directement dans la pile : année ENTER jour ENTER mois, car c'est ainsi que mon programme les utilise. Ainsi on gagnerait une dizaine de lignes initiales.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit, Optimisez - N°12

Message par C.Ret »

Bon , ce n'est pas sans mal que j'obtient enfin une version qui donne un résultat convenable !

Mais, je suis un peu hors compétition, car je n'est pas respecté le format 2011.1116 indiqué dans l'excercice.

Voici donc un code pour HP-41C, qui n'est pas optimal car il utilise les capacité alphanumérique de l'engin pour éviter des erreur d'interprétation. Je ne sais pas pur vous, mais moi j'ai beaucoup de mal avec les chiffres pour indiquer les jours:

Code : Tout sélectionner

01 LBL A        21 +          39 LBL 09        53 LBL 03
02 "YEAR        22 x:y        40 ST/ L         54 "WENES
03 PROMPT       23 +          41 x: L          55 RTN
04 -1           24 4          42 INT
05 2            25 XEQ 09     43 RTN           56 LBL 04
06 "MONTH       26 25                          57 "THURS
07 PROMPT       27 XEQ 09     44 LBL 00        58 RTN
08 -            28 4          45 "SUN
09 *            29 XEQ 09     46 RTN           59 LBL 05              
10 12           30 -                           60 "FRI
11 ST+ L        31 -          47 LBL 01        61 RTN
12 ST/ Y        32 +          48 "MON
13 XEQ 09       33 7          49 RTN           62 LBL 06
14 ST- Z        34 MOD                         63 "SATUR
15 +            35 XEQ IND X  50 LBL 02        64 RTN
16 31           36 "~DAY      51 "TUES         
17 *            37 AWIEV      52 RTN           65 END     
18 INT          38 RTN
19 "DAY        
20 PROMPT
Comme vous le remarquerait, l'affichage du jour se fait en anglais à partir du saut XEQ IND X de la ligne 35 dans les sous-programmes LBL 00 à LBL 06

La methode utilisée est celle de Claus Tondering qui a l'avantage de ne pas avoir à utiliser de test pour les années bissectiles et le réajustement les millénaires. Tout se fait par le calcul et les arrondis des division entières astucieuses.

Le programme se lance en appuyant sur la touche USER A, l'HP-41C demande alors l'année en affichant "YEAR ".
Saisir l'année en 4 ou 2 chiffres(*) puis presser [R/S]. Le calculateur attend alors le mois en affichant "MONTH ".
Saisir le numéro de celui-ci de 1 à 12 puis presser [R/S]
Après quelques fraction de seconde en calcul, l'affichage indique "DAY ".
Saisir le numéro du jour (de 1 à 31 en fonction des mois).
Appuyer sur [R/S], le nom du jour s'affiche; SUNDAY, MONDAY, TUESDAY, WENESDAY, THURSDAY,FRIDAY ou SATURDAY.



Voici la version sans les PROMPT et l'affichage alphanumérique:

Code : Tout sélectionner

01 LBL B        21 XEQ 09
02 -1           22 25
03 2            23 XEQ 09
04 STOP         24 4
05 -            25 XEQ 09
06 *            26 -
07 12           27 -
08 ST+ L        28 +
09 ST/ Y        29 7
10 XEQ 09       30 MOD
11 ST- Z        31 RTN
12 +            
13 31           32 LBL 09
14 *            33 ST/ L
15 INT          34 x: L
16 STOP         35 INT
17 +            36 RTN
18 x:y  
19 +  
20 4  
L'uilisation est un mode USER; 2011[ B ] 11 [R/S] 17 [R/S] affiche 4.0000 qui signifie Jeudi:
Le code numérique est

Code : Tout sélectionner

0: Sunday     Dimanche
1: Monday     Lundi
2: Tuesday    Mardi
3: Wenesday   Mercredi
4: Thuesday   Jeudi
5: Friday     Vendredi
6: Saturday   Samedi

Il reste un sous-programme car la séquence ST/L; x:l ; INT se répète quatre fois dans le code, ce qui amorti le coût des appels et retour de sous-programme !

P.S.: x: L = registre de pile x échangé avec registre de sauvegarde LastX. Les STOP sont en fait les R/S dans le programme, c'est une des nombreuses curiosité des HP-41, [ R/S ] s'affiche STOP !


Bon et pour ceux ou celles qui préfèrent le BASIC, voici le même algorithme pour SHARP PC-1211 :

Code : Tout sélectionner

10 "J"INPUT "Y,M,D  ";Y,M,D:A=INT((14-M)/12),B=M+12A-2,A=Y-A
20 J=D+A+INT .25A-INT .01A+INT .0025A+INT (31B/12)
30 GOSUB 40+J-7*INT (J/7):PRINT USING ;Y;M;D;"=";W$;"DAY (";J;")":GOTO 10
40 W$="SUN":RETURN
41 W$="MON":RETURN
42 W$="TUES":RETURN
43 W$="WENES":RETURN
44 W$="THURS":RETURN 
45 W$="FRI":RETURN
46 W$="SATUR":RETURN

(*) Attention: il n'est possible de saisir une date abrègée sur deux chiffres que pour les année 16-- 20-- 24-- etc. Ce qui veut dire que 11/11/11 signifie 11 novembre 2011, et 11/11/18 signifie 11 novembre 2018 et non la fin de la guerre !
Donc, pour éviter les erreurs, il est préfèrable de saisir les 4 chiffres de l'année !
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3626
Enregistré le : 06 sept. 2011 14:57
Localisation : Normandie

Re: Misez p'tit, Optimisez - N°12

Message par Hobiecat »

Chouette version RPN sur la 41 ! On voit quand même l'avantage de la puissance de cette machine avec les manipulations de la pile en direct (et accessoirement la présence de MOD).
Répondre

Retourner vers « Tous les Pockets »