Misez p'tit, Optimisez - N°12
Modérateur : Politburo
Misez p'tit, Optimisez - N°12
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.
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
Re: Misez p'tit, Optimisez - N°12
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
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-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
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
Re: Misez p'tit, Optimisez - N°12
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 :
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
- Hobiecat
- Fonctionne à 9600 bauds
- Messages : 3644
- Enregistré le : 06 sept. 2011 14:57
- Localisation : Normandie
Re: Misez p'tit, Optimisez - N°12
J'essaie sur la 15C, mais c'est compliqué si on veut n'utiliser que la pile....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
0 -> Dimanche ... 6 -> SamediCode : 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
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'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 !
Re: Misez p'tit, Optimisez - N°12
Bjr, je me suis basé sur cela :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 !
http://cosmos2000.chez.com/Vendredi13/M ... thode.htmlDans 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 :
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
(d+=m<3?y--:y-2, 23*m/9 + d + 4 + y/4 -y/100 + y/400) ÷ 7
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
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
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
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
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
- Hobiecat
- Fonctionne à 9600 bauds
- Messages : 3644
- Enregistré le : 06 sept. 2011 14:57
- Localisation : Normandie
Re: Misez p'tit, Optimisez - N°12
C'est là que je ne trouvais pas le -1 !Gilles59 a écrit :Dans ce prog il y a aussi une astuce sur :qui permet de calculer "z" et "- 2 (si m >= 3)" en même temps si j'ose dire.Code : Tout sélectionner
2 x>=F DSZ x>=F 0 M-1F
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)
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 !
Edit : une version 15c pas très optimisée, mais sur la pile uniquement (et juste un petit flag )
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
Modifié en dernier par Hobiecat le 15 nov. 2011 14:52, modifié 2 fois.
Re: Misez p'tit, Optimisez - N°12
En tout cas c'est trés 'propre' même pour moi qui ne maitrise pas trop le RPNHobiecat 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 !
Edit : une version 15c pas très optimisée, mais sur la pile uniquement (et juste un petit flag )
...
On doit pouvoir faire mieux...
J'ai essayé sur un TI66 mais j'ai vraiment du mal avec cette machine
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
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
- Hobiecat
- Fonctionne à 9600 bauds
- Messages : 3644
- Enregistré le : 06 sept. 2011 14:57
- Localisation : Normandie
Re: Misez p'tit, Optimisez - N°12
Pas d'avis sur les RPL, ce sont celles que je ne maîtrise pas ! 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.Gilles59 a écrit :En RPL, on peut refaire pas à pas le prg RPN avec des IFT à la place des GTO
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 ?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
Re: Misez p'tit, Optimisez - N°12
DUP à place de ENTER, SWAP à la place de X<>Y, IP pour INT, FP pour FRAC et 2 3 bricoles !Hobiecat a écrit :Pas d'avis sur les RPL, ce sont celles que je ne maîtrise pas !Gilles59 a écrit :En RPL, on peut refaire pas à pas le prg RPN avec des IFT à la place des GTO
Probablement. Sur 15C tu peux bien raccourcir en utilisant des mémoires je pense (c gruger )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.
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 )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 finJ'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 ?
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
Re: Misez p'tit, Optimisez - N°12
En 55 pas, mode fou furieux et degré comprenne qui peut :
j'ai remis des '*' pour le signe 'multiplier' à la place du 'x' de la 602P, c'est plus clair
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
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
- Hobiecat
- Fonctionne à 9600 bauds
- Messages : 3644
- Enregistré le : 06 sept. 2011 14:57
- Localisation : Normandie
Re: Misez p'tit, Optimisez - N°12
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...
Ci-dessous la version corrigée, avec la pile en prime du coup :
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
- C.Ret
- Fonctionne à 9600 bauds
- Messages : 3421
- Enregistré le : 31 mai 2008 23:43
- Localisation : N 49°22 E 6°10
Re: Misez p'tit, Optimisez - N°12
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"
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.
- Hobiecat
- Fonctionne à 9600 bauds
- Messages : 3644
- Enregistré le : 06 sept. 2011 14:57
- Localisation : Normandie
Re: Misez p'tit, Optimisez - N°12
Oui on peut, mais pour la version RPN, je me suis plié à la régle définie par Gilles !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"
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.
- C.Ret
- Fonctionne à 9600 bauds
- Messages : 3421
- Enregistré le : 31 mai 2008 23:43
- Localisation : N 49°22 E 6°10
Re: Misez p'tit, Optimisez - N°12
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:
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:
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
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 :
(*) 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 !
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
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
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.
- Hobiecat
- Fonctionne à 9600 bauds
- Messages : 3644
- Enregistré le : 06 sept. 2011 14:57
- Localisation : Normandie
Re: Misez p'tit, Optimisez - N°12
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).