Misez P'tit, Optimisez - N°32 (factorielle)
Modérateur : Politburo
- badaze
- Fonctionne à 14400 bauds
- Messages : 8402
- Enregistré le : 12 févr. 2007 18:36
- Localisation : Pas très loin de Lyon
- Contact :
Misez P'tit, Optimisez - N°32 (factorielle)
Bonjour,
Un petit MPO sur le thème de la factorielle, avec bien sûr interdiction d'utiliser la fonction.
De mémoire j'avais fait un programme pour TI 57 de 5 ou 6 pas (à l'époque je l'avais envoyé à l'OP mais il n'avait pas été publié) et bien entendu je ne l'ai pas retrouvé ni m'en souviens.
Un petit MPO sur le thème de la factorielle, avec bien sûr interdiction d'utiliser la fonction.
De mémoire j'avais fait un programme pour TI 57 de 5 ou 6 pas (à l'époque je l'avais envoyé à l'OP mais il n'avait pas été publié) et bien entendu je ne l'ai pas retrouvé ni m'en souviens.
Tout est bon dans le pocket.
Moi j'aime tout.... Casio, HP, Sharp, TI et les autres sauf que les TI semblent ne pas m'aimer
http://www.emmella.fr
Mes Casio - HP - Sharp - TI
Homme invisible.
Moi j'aime tout.... Casio, HP, Sharp, TI et les autres sauf que les TI semblent ne pas m'aimer
http://www.emmella.fr
Mes Casio - HP - Sharp - TI
Homme invisible.
Re: Misez P'tit, Optimisez - N°32 (factorielle)
Oh, franchement...
STO 0
Lbl 0
rcl 0
*
Dsz
Gto 0
=
R/S
Ou un truc comme çà non ?
STO 0
Lbl 0
rcl 0
*
Dsz
Gto 0
=
R/S
Ou un truc comme çà non ?
HP : 67 25 34C 15C 41CX 48S* 48SX 48GX 35S* WP34S* 39gII*
TI : SR52 57 58C* 59 Programmer 66 74S 65
Sharp : PC 1245 1251* 1262 G-850S G-850V
Canon : X-07* F-800P*
Casio : CG-8 SF5300E*
*: persos d'époque
TI : SR52 57 58C* 59 Programmer 66 74S 65
Sharp : PC 1245 1251* 1262 G-850S G-850V
Canon : X-07* F-800P*
Casio : CG-8 SF5300E*
*: persos d'époque
- zpalm
- Fonctionne à 9600 bauds
- Messages : 2931
- Enregistré le : 03 mai 2008 15:33
- Localisation : Grenoble
Re: Misez P'tit, Optimisez - N°32 (factorielle)
WP 34S:
Avec un pas de plus on laisse Y, Z &T intacts:
Code : Tout sélectionner
01 LBL A
02 ENTER
03 DSE Y
04 SKIP 001
05 RTN
06 RCLx Y
07 BACK 004
Code : Tout sélectionner
01 LBL A
02 STO L
03 DSE X
04 SKIP 002
05 x<>L
06 RTN
07 STOx L
08 BACK 005
- zpalm
- Fonctionne à 9600 bauds
- Messages : 2931
- Enregistré le : 03 mai 2008 15:33
- Localisation : Grenoble
Re: Misez P'tit, Optimisez - N°32 (factorielle)
Et sur TI 57: 7 pas, comme la WP 34S (mais sans label). Vraiment surprenante cette petite machine, il va m'en falloir une un jour
Après avoir rentré le programme on tape RST (pour revenir au début de la mémoire programme), le nombre dont on veut calculer la factorielle puis R/S.
Par ex:
RST 5 R/S donne 120
RST 1 R/S donne 1
L'astuce c'est d'utiliser RST au lieu de GTO ce qui évite le LBL, avec cela le STO 0 se retrouve dans la boucle, il faut donc déplacer le '=' pour que lors de l'exécution de la boucle le STO 0 suive le RCL 0 pour ne ne pas modifier le registre 0.
La deuxième astuce c'est le INV 2nd DSZ (Decrement & Skip if not Zero), une instruction qui n'existe pas sur les machines HP et qui évite un saut supplémentaire.
(@badaze, si tu as une solution en 5 ou 6 pas je suis curieux de la voir...)
Code : Tout sélectionner
00 STO 0
01 =
02 INV 2nd DSZ (Decrement & Skip if not Zero)
03 INV SBR (RTN)
04 *
05 RCL 0
06 RST (Reset program counter to first step = GTO 00)
Par ex:
RST 5 R/S donne 120
RST 1 R/S donne 1
L'astuce c'est d'utiliser RST au lieu de GTO ce qui évite le LBL, avec cela le STO 0 se retrouve dans la boucle, il faut donc déplacer le '=' pour que lors de l'exécution de la boucle le STO 0 suive le RCL 0 pour ne ne pas modifier le registre 0.
La deuxième astuce c'est le INV 2nd DSZ (Decrement & Skip if not Zero), une instruction qui n'existe pas sur les machines HP et qui évite un saut supplémentaire.
(@badaze, si tu as une solution en 5 ou 6 pas je suis curieux de la voir...)
- C.Ret
- Fonctionne à 9600 bauds
- Messages : 3419
- Enregistré le : 31 mai 2008 23:43
- Localisation : N 49°22 E 6°10
Re: Misez P'tit, Optimisez - N°32 (factorielle)
Pour les calculettes biologiques :
ou
Et pour les machine moins biologiques:
Code : Tout sélectionner
« IF DUP 1 >
THEN
DUP 1 - F! *
END
»
'F!' STO
Code : Tout sélectionner
« 1
DUP ROT FOR f
f *
NEXT
»
'FCT!' STO
Code : Tout sélectionner
n
001 LBL "FCT
002 1 n 1
003 x<>Y 1 n
004 Lbl 00 prd f
005 ST* Y prd.f f
006 DSE X prd.f f-1
007 GTO 00
n! 0
008 Rdn
009 END n!
Code : Tout sélectionner
1:"F"AREAD N:F=1:FOR I=1 TO N:F=FI:NEXT I:PRINT N,F:END
Modifié en dernier par C.Ret le 15 janv. 2013 11:00, modifié 2 fois.
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.
- bernouilli92
- Fonctionne à 14400 bauds
- Messages : 5264
- Enregistré le : 21 nov. 2012 13:03
- Localisation : Ile de France
Re: Misez P'tit, Optimisez - N°32 (factorielle)
Voici ma version en RPL :
Et ma version pour hp41, mais elle ne fonctionne pas pour la valeur 0 (et inférieur) :
Code : Tout sélectionner
« 1 OVER 1 - FOR I I * NEXT »
Code : Tout sélectionner
000 LBL FACTO
001 ENTER
002 LBL 00
003 1
004 -
005 x=0?
006 GTO 01
007 *
008 LASTx
009 GTO 00
010 LBL 01
011 +
HP, Casio, Sharp, Psion, quelques TI et divers autres
- C.Ret
- Fonctionne à 9600 bauds
- Messages : 3419
- Enregistré le : 31 mai 2008 23:43
- Localisation : N 49°22 E 6°10
Re: Misez P'tit, Optimisez - N°32 (factorielle)
Le souci provient de 0! qui avec ce code ne fait pas 1 ?bernouilli92 a écrit :Voici ma version en RPL :Code : Tout sélectionner
« 1 OVER 1 - FOR I I * NEXT »
Par ailleurs cela fait une instruction de plus que
« 1 DUP ROT FOR f f * NEXT »
Qui donne bien 0!=1
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.
- bernouilli92
- Fonctionne à 14400 bauds
- Messages : 5264
- Enregistré le : 21 nov. 2012 13:03
- Localisation : Ile de France
Re: Misez P'tit, Optimisez - N°32 (factorielle)
Tu as raison, je n'ai pas testé mon code avec la valeur 0C.Ret a écrit :Le souci provient de 0! qui avec ce code ne fait pas 1 ?bernouilli92 a écrit :Voici ma version en RPL :Code : Tout sélectionner
« 1 OVER 1 - FOR I I * NEXT »
Par ailleurs cela fait une instruction de plus que
« 1 DUP ROT FOR f f * NEXT »
Qui donne bien 0!=1
HP, Casio, Sharp, Psion, quelques TI et divers autres
- badaze
- Fonctionne à 14400 bauds
- Messages : 8402
- Enregistré le : 12 févr. 2007 18:36
- Localisation : Pas très loin de Lyon
- Contact :
Re: Misez P'tit, Optimisez - N°32 (factorielle)
C'était il y a plus de 30 ans....zpalm a écrit : (@badaze, si tu as une solution en 5 ou 6 pas je suis curieux de la voir...)
Tout est bon dans le pocket.
Moi j'aime tout.... Casio, HP, Sharp, TI et les autres sauf que les TI semblent ne pas m'aimer
http://www.emmella.fr
Mes Casio - HP - Sharp - TI
Homme invisible.
Moi j'aime tout.... Casio, HP, Sharp, TI et les autres sauf que les TI semblent ne pas m'aimer
http://www.emmella.fr
Mes Casio - HP - Sharp - TI
Homme invisible.
- zpalm
- Fonctionne à 9600 bauds
- Messages : 2931
- Enregistré le : 03 mai 2008 15:33
- Localisation : Grenoble
Re: Misez P'tit, Optimisez - N°32 (factorielle)
Bien vu le coup du 1 dans la pile! Appliqué à la WP 34S on descend à 6 pas avec:C.Ret a écrit :Et pour les machine moins biologiques:Code : Tout sélectionner
n 001 LBL "FCT 002 1 n 1 003 x<>Y 1 n 004 Lbl 00 prd f 005 ST* Y prd.f f 006 DSE X prd.f f-1 007 GTO 00 n! 0 008 Rdn 009 END n!
Code : Tout sélectionner
n
001 LBL A
002 1 n 1
003 RCL* Y f prd.f
004 DSE Y f-1 prd.f
005 BACK 002
006 END n!
- C.Ret
- Fonctionne à 9600 bauds
- Messages : 3419
- Enregistré le : 31 mai 2008 23:43
- Localisation : N 49°22 E 6°10
Re: Misez P'tit, Optimisez - N°32 (factorielle)
Bien vu bien vu c'est vite dit !
Car cela n'empêche pas de répondre que 0!=0 au lieu de 1
Car cela n'empêche pas de répondre que 0!=0 au lieu de 1
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.
- zpalm
- Fonctionne à 9600 bauds
- Messages : 2931
- Enregistré le : 03 mai 2008 15:33
- Localisation : Grenoble
Re: Misez P'tit, Optimisez - N°32 (factorielle)
Il suffit de rajouter un petit test et c'est bon:C.Ret a écrit :Bien vu bien vu c'est vite dit !
Car cela n'empêche pas de répondre que 0!=0 au lieu de 1
Code : Tout sélectionner
n
001 LBL A
002 1 n 1
003 x<=? Y
004 RCL* Y f prd.f
005 DSE Y f-1 prd.f
006 BACK 002
007 END n!
Re: Misez P'tit, Optimisez - N°32 (factorielle)
J'ai pas la 602 (ou 502), sous la main mais :
en 8 pas devrait le faire avec 0! -> 1
Doit y avoir mieux
pas mieux que les solution précédente en RPL
Code : Tout sélectionner
Min00 ISZ
LBL0
MR00
*
DSZ
GOTO0
=
Doit y avoir mieux
pas mieux que les solution précédente en RPL
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°32 (factorielle)
MMmmm si ISZ fait ce que je pense, tu ne serais pas en train de calculer factorielle de N+1 ?Gilles59 a écrit :J'ai pas la 602 (ou 502), sous la main mais :
en 8 pas devrait le faire avec 0! -> 1Code : Tout sélectionner
Min00 ISZ LBL0 MR00 * DSZ GOTO0 =
Doit y avoir mieux
pas mieux que les solution précédente en RPL
HP : 67 25 34C 15C 41CX 48S* 48SX 48GX 35S* WP34S* 39gII*
TI : SR52 57 58C* 59 Programmer 66 74S 65
Sharp : PC 1245 1251* 1262 G-850S G-850V
Canon : X-07* F-800P*
Casio : CG-8 SF5300E*
*: persos d'époque
TI : SR52 57 58C* 59 Programmer 66 74S 65
Sharp : PC 1245 1251* 1262 G-850S G-850V
Canon : X-07* F-800P*
Casio : CG-8 SF5300E*
*: persos d'époque
Re: Misez P'tit, Optimisez - N°32 (factorielle)
Sur TI57 avec la contrainte 0!=1 et une utilisation sans préstockage dans les registres je n'ai pas grand chose de dément...
00 Sto 0
01 1
02 Sto 1
03 Lbl 0
04 Inv Dsz
05 Gto 1
06 Rcl 0
07 Prd 1
08 Gto 0
09 Lbl 1
10 Rcl 1
11 R/S
On ne peut plus ruser avec RST à cause de l'initialisation de R0 et R1. Et on ne peut pas trop éviter deux labels : un pour boucler, un pour sortir de la boucle.
00 Sto 0
01 1
02 Sto 1
03 Lbl 0
04 Inv Dsz
05 Gto 1
06 Rcl 0
07 Prd 1
08 Gto 0
09 Lbl 1
10 Rcl 1
11 R/S
On ne peut plus ruser avec RST à cause de l'initialisation de R0 et R1. Et on ne peut pas trop éviter deux labels : un pour boucler, un pour sortir de la boucle.
HP : 67 25 34C 15C 41CX 48S* 48SX 48GX 35S* WP34S* 39gII*
TI : SR52 57 58C* 59 Programmer 66 74S 65
Sharp : PC 1245 1251* 1262 G-850S G-850V
Canon : X-07* F-800P*
Casio : CG-8 SF5300E*
*: persos d'époque
TI : SR52 57 58C* 59 Programmer 66 74S 65
Sharp : PC 1245 1251* 1262 G-850S G-850V
Canon : X-07* F-800P*
Casio : CG-8 SF5300E*
*: persos d'époque