Misez P'tit, Optimisez - N°32 (factorielle)

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

Répondre
Avatar du membre
badaze
Fonctionne à 14400 bauds
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)

Message par badaze »

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.
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.
Avatar du membre
bkg2018
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 359
Enregistré le : 30 mai 2012 16:57

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par bkg2018 »

Oh, franchement...

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
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2928
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par zpalm »

WP 34S:

Code : Tout sélectionner

01 LBL A
02 ENTER
03 DSE Y
04 SKIP 001
05 RTN
06 RCLx Y
07 BACK 004
Avec un pas de plus on laisse Y, Z &T intacts:

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
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2928
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par zpalm »

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 :wink:

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)
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...)
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3417
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par C.Ret »

Pour les calculettes biologiques :

Code : Tout sélectionner

« IF DUP 1 >
  THEN
    DUP 1 - F! *
  END
»
'F!' STO
ou

Code : Tout sélectionner

« 1
  DUP ROT FOR f
    f *
  NEXT
»
'FCT!' STO
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

 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.
Avatar du membre
bernouilli92
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5256
Enregistré le : 21 nov. 2012 13:03
Localisation : Ile de France

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par bernouilli92 »

Voici ma version en RPL :

Code : Tout sélectionner

« 1 OVER 1 - FOR I I * NEXT »
Et ma version pour hp41, mais elle ne fonctionne pas pour la valeur 0 (et inférieur) :

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
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3417
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par C.Ret »

bernouilli92 a écrit :Voici ma version en RPL :

Code : Tout sélectionner

« 1 OVER 1 - FOR I I * NEXT »
Le souci provient de 0! qui avec ce code ne fait pas 1 ?

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.
Avatar du membre
bernouilli92
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5256
Enregistré le : 21 nov. 2012 13:03
Localisation : Ile de France

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par bernouilli92 »

C.Ret a écrit :
bernouilli92 a écrit :Voici ma version en RPL :

Code : Tout sélectionner

« 1 OVER 1 - FOR I I * NEXT »
Le souci provient de 0! qui avec ce code ne fait pas 1 ?

Par ailleurs cela fait une instruction de plus que
« 1 DUP ROT FOR f f * NEXT »
Qui donne bien 0!=1
Tu as raison, je n'ai pas testé mon code avec la valeur 0
HP, Casio, Sharp, Psion, quelques TI et divers autres
Avatar du membre
badaze
Fonctionne à 14400 bauds
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)

Message par badaze »

zpalm a écrit : (@badaze, si tu as une solution en 5 ou 6 pas je suis curieux de la voir...)
C'était il y a plus de 30 ans....
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.
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2928
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par zpalm »

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!
Bien vu le coup du 1 dans la pile! Appliqué à la WP 34S on descend à 6 pas avec:

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!
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3417
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par C.Ret »

Bien vu bien vu c'est vite dit !

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.
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2928
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par zpalm »

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 :?
Il suffit de rajouter un petit test et c'est bon:

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!
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par Gilles59 »

J'ai pas la 602 (ou 502), sous la main mais :

Code : Tout sélectionner

Min00 ISZ
LBL0
MR00 
*
DSZ
GOTO0
=
en 8 pas devrait le faire avec 0! -> 1
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
Avatar du membre
bkg2018
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 359
Enregistré le : 30 mai 2012 16:57

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par bkg2018 »

Gilles59 a écrit :J'ai pas la 602 (ou 502), sous la main mais :

Code : Tout sélectionner

Min00 ISZ
LBL0
MR00 
*
DSZ
GOTO0
=
en 8 pas devrait le faire avec 0! -> 1
Doit y avoir mieux

pas mieux que les solution précédente en RPL
MMmmm si ISZ fait ce que je pense, tu ne serais pas en train de calculer factorielle de N+1 ?
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
Avatar du membre
bkg2018
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 359
Enregistré le : 30 mai 2012 16:57

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par bkg2018 »

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.
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
Répondre

Retourner vers « Tous les Pockets »