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 de l’utilisateur
badaze
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6856
Inscription : 12 févr. 2007 19:36
Localisation : Pas très loin de Lyon
Contact :

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

Message par badaze » 15 janv. 2013 00:26

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 de l’utilisateur
bkg2018
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 359
Inscription : 30 mai 2012 16:57

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

Message par bkg2018 » 15 janv. 2013 00:57

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 de l’utilisateur
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2499
Inscription : 03 mai 2008 15:33
Localisation : Grenoble

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

Message par zpalm » 15 janv. 2013 02:11

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 de l’utilisateur
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2499
Inscription : 03 mai 2008 15:33
Localisation : Grenoble

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

Message par zpalm » 15 janv. 2013 09:43

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 de l’utilisateur
C.Ret
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2018
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

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

Message par C.Ret » 15 janv. 2013 11:00

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
Dernière édition par C.Ret le 15 janv. 2013 12:00, édité 2 fois.
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803+ sd2iec. | TI-57 LCD | TI-74 BasiCalc | TI-92 II | HP-28S + HP82240A | HP-41C + (2 memory + stat + IR) modules. | HP Prime Wireless Graphing Calculator |HP-15C | CASIO fx-602p + FA-1. .Sommaire des M.P.O.. . Sommaire du P.C.T.M. .

Avatar de l’utilisateur
bernouilli92
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3241
Inscription : 21 nov. 2012 14:03
Localisation : Ile de France

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

Message par bernouilli92 » 15 janv. 2013 11:23

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 de l’utilisateur
C.Ret
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2018
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

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

Message par C.Ret » 15 janv. 2013 12:07

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 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803+ sd2iec. | TI-57 LCD | TI-74 BasiCalc | TI-92 II | HP-28S + HP82240A | HP-41C + (2 memory + stat + IR) modules. | HP Prime Wireless Graphing Calculator |HP-15C | CASIO fx-602p + FA-1. .Sommaire des M.P.O.. . Sommaire du P.C.T.M. .

Avatar de l’utilisateur
bernouilli92
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3241
Inscription : 21 nov. 2012 14:03
Localisation : Ile de France

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

Message par bernouilli92 » 15 janv. 2013 13:03

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 de l’utilisateur
badaze
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6856
Inscription : 12 févr. 2007 19:36
Localisation : Pas très loin de Lyon
Contact :

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

Message par badaze » 15 janv. 2013 13:15

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 de l’utilisateur
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2499
Inscription : 03 mai 2008 15:33
Localisation : Grenoble

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

Message par zpalm » 15 janv. 2013 13:52

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 de l’utilisateur
C.Ret
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2018
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

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

Message par C.Ret » 15 janv. 2013 14:07

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 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803+ sd2iec. | TI-57 LCD | TI-74 BasiCalc | TI-92 II | HP-28S + HP82240A | HP-41C + (2 memory + stat + IR) modules. | HP Prime Wireless Graphing Calculator |HP-15C | CASIO fx-602p + FA-1. .Sommaire des M.P.O.. . Sommaire du P.C.T.M. .

Avatar de l’utilisateur
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2499
Inscription : 03 mai 2008 15:33
Localisation : Grenoble

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

Message par zpalm » 15 janv. 2013 14:21

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 : 1290
Inscription : 27 oct. 2010 20:46

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

Message par Gilles59 » 15 janv. 2013 14:43

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+

Avatar de l’utilisateur
bkg2018
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 359
Inscription : 30 mai 2012 16:57

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

Message par bkg2018 » 15 janv. 2013 15:04

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 de l’utilisateur
bkg2018
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 359
Inscription : 30 mai 2012 16:57

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

Message par bkg2018 » 15 janv. 2013 15:07

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

Revenir vers « Tous les Pockets »