Misez p'tit, Optimisez - N°10 (hommage à J. McCarthy)

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

Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2918
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Misez p'tit, Optimisez - N°10 (hommage à J. McCarthy)

Message par zpalm »

Hobiecat a écrit :
cgh a écrit :Une version en FORTH (testée sous pfe). Pour ceux qui possèdent le module FORTH pour HP-71B.

Code : Tout sélectionner

: m91
dup 101 < if 11 + recurse recurse else 10 - then
;
J'adore vraiment ces fils misez p'tit : que de découvertes de bidouilles de programmation, de particularités de machines ou comme ici, de subtilités de langages !
Pas de recurse sur le FORTH du HP 71B :(

J’ai adapté le programme BASIC de Charo ( le premier celui avec le IF … THEN … GOTO, pas celui avec le FOR ... NEXT pour Sharp uniquement) et ça donne ça en FORTH sur le HP 71B:

Code : Tout sélectionner

: MCC 1 BEGIN DUP 0> WHILE
 OVER 100 > 2* + 1 +
 SWAP DUP 100 > 21 * + 11 + SWAP REPEAT
DROP ;
Ca ne marche qu’avec des nombres entiers positifs ou négatifs (par defaut en FORTH):
-5 MCC . donne 91
110 MCC . donne 100

Si vous n’avez pas de HP 71B ou pas de module FORTH je vous recommande EMU71* de Christoph Giesselink. Pour les ROMs voir sur la page de l’autre EMU71, celui de J.F. Garnier.

* n'émule que les 71B dorés :wink:
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Misez p'tit, Optimisez - N°10 (hommage à J. McCarthy)

Message par Gilles59 »

Variante RPL pour des entiers :

Code : Tout sélectionner

« 10 - 91 DUP2 < {SWAP} IFT DROP »
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°10 (hommage à J. McCarthy)

Message par Gilles59 »

zpalm a écrit :
Hobiecat a écrit :
cgh a écrit :Une version en FORTH (testée sous pfe). Pour ceux qui possèdent le module FORTH pour HP-71B.

Code : Tout sélectionner

: m91
dup 101 < if 11 + recurse recurse else 10 - then
;
J'adore vraiment ces fils misez p'tit : que de découvertes de bidouilles de programmation, de particularités de machines ou comme ici, de subtilités de langages !
Pas de recurse sur le FORTH du HP 71B :(
Tu dois pouvoir faire :

Code : Tout sélectionner

: m91
dup 101 < if 11 + m91 m91 else 10 - then
;
??
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
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2918
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Misez p'tit, Optimisez - N°10 (hommage à J. McCarthy)

Message par zpalm »

Non, en forth on ne peut pas faire référence à un mot qui n'est pas encore défini, ce qui est le cas dans ton exemple.

D'où l'utilité du recurse ....
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3404
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit, Optimisez - N°10 (hommage à J. McCarthy)

Message par C.Ret »

Gilles59 a écrit :Variante RPL pour des entiers :

Code : Tout sélectionner

« 10 - 91 DUP2 < {SWAP} IFT DROP »

Pour ces mêmes entiers, je mise plus petit :

Code : Tout sélectionner

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

Re: Misez p'tit, Optimisez - N°10 (hommage à J. McCarthy)

Message par Gilles59 »

C.Ret a écrit :
Gilles59 a écrit :Variante RPL pour des entiers :

Code : Tout sélectionner

« 10 - 91 DUP2 < {SWAP} IFT DROP »

Pour ces mêmes entiers, je mise plus petit :

Code : Tout sélectionner

 « 10 - 91 MAX » 

Bien vu ! :D
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
charognard
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4412
Enregistré le : 06 juin 2007 19:28
Localisation : Indre et loire
Contact :

Re: Misez p'tit, Optimisez - N°10 (hommage à J. McCarthy)

Message par charognard »

ça sera très dur de faire plus court !!
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3404
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit, Optimisez - N°10 (hommage à J. McCarthy)

Message par C.Ret »

Bon, d'accord je change de méthode !

Voici de quoi chercher des poux dans les octets :

Il s'agit d'une version pour HP-97 / HP-67.
Le principe est simple, tout tien dans la pile, mais j'y met le nombre d'appels qui reste à effectuer; il est initalisé à 1 (puis est appelé c dans le tableau.
Comme tout dépen du test 'n>100', et pour éviter de le répéter, le drapeau (Flag 1) est utilisé. Il est baissé (clear) lorsque n<=100 et dressé (set) lorsque n>100.
Pour faciliter la lecture, j'ai représenté les registres de la pile deux fois. Cela parait compliqué, mais c'est plus simple pour bien suivre le déroulemtn des opérations.
La bouvel principale (LBL 0) teste n et 100, met à jour le Flag 1, modifie n en conséquence puis incrémente ou décrémente c et effectue le test d'arrêt (en fait le test de boucle tant que c>0).

Code : Tout sélectionner

              |                x > 100              |               x <= 100              | 
       Flag1: |                 Set                 |                Clear                | 
              |       t:       z:       y:       x: |       t:       z:       y:       x: | 
--- --------- + -------- -------- -------- -------- + -------- -------- -------- -------- + 
              |                                   x |                                   x | 
              |                                     |                                     | 
001 1         |                          x        1 |                          x        1 | 
002 LBL 0     |                          x        c |                          x        c | 
003 x:y       |                          c        x |                          c        x | 
004 SF 1      |                          c        x | ######## ######## ######## ######## | 
005 2         |                 c        x        2 | ######## ######## ######## ######## | 
006 10^x      |                 c        x      100 | ######## ######## ######## ######## | 
007 x:y       |                 c      100        x | ######## ######## ######## ######## | 
008 x <= y ?  |                                     | ######## ######## ######## ######## | 
009 CF 1      |                 c      100  x(>100) |                 c      100 x(<=100) | 
010 x:y       |                 c        x      100 |                 c        x      100 | 
011 SQRT      |                 c        x       10 |                 c        x       10 | 
012 F 1 Set ? |                                     |                                     | 
013 CHS       |                 c        x      -10 |                          x       10 | 
014 +         |                          c     x-10 |                          c     x+10 | 
015 1         |                 c     x-10        1 |                 c     x+10        1 | 
016 F 1 Set ? |                                     |                                     | 
017 Clx       |                 c     x-10        0 |                 c     x+10        1 | 
018 +         |                          c     x-10 |                          c     x+11 | 
019 x:y       |                       x-10        c |                       x+11        c | 
020 1         |              x-10        c        1 |              x+11        c        1 | 
021 F 1 Set ? |                                     |                                     | 
022 CHS       |              x-10        c       -1 |              x+11        c        1 | 
023 +         |                       x-10      c-1 |                       x+11      c+1 | 
024 x>0 ?     |                                     |                                     | 
025 GTO 0     |                       M(x)        0 |                       M(x)        0 | 
026 R<dwn>    |                                M(x) |                                M(x) | 
              |                                     |                                     | 
--- --------- + -------- -------- -------- -------- + -------- -------- -------- -------- + 

Il doit certainement il avoir plus court, rien qu'en utulisant des tests x <?> y plus efficaces.


Pour les entiers :

Code : Tout sélectionner

--- --------- + -------- -------- -------- -------- +
              |       t:       z:       y:       x: |
--- --------- + -------- -------- -------- -------- +
              |                ..        .        n |
--- --------- + -------- -------- -------- -------- +
001 1         |                          n        1 |
002 0         |                          n       10 |
003 -         |                                n-10 |
004 9         |                       n-10        9 |
005 1         |                       n-10       91 |
006 x <= y ?  |                                     |
007 x:y       |                          ~     M(n) |
--- --------- + -------- -------- -------- -------- +
              |       ..        .        ~     M(n) |
--- --------- + -------- -------- -------- -------- +
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
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7141
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

Re: Misez p'tit, Optimisez - N°10 (hommage à J. McCarthy)

Message par gege »

cgh a écrit :Une version en FORTH (testée sous pfe). Pour ceux qui possèdent le module FORTH pour HP-71B.

Code : Tout sélectionner

: m91
dup 101 < if 11 + recurse recurse else 10 - then
;
Cool, j'ai essayé sur le petit langage forth que j'ai tapoté sur TI89, le code suivant :

Code : Tout sélectionner

: m91 dup 101 < if 11 + m91 m91 exit then 10 - ;
L'appel d'un mot pas encore défini est possible car ce bidule est interprété :oops:, comme quoi ça peut être intéressant les interpréteurs...
On remarque aussi que je n'ai pas encore fait le 'else', donc grosse bidouille avec un mot ad-hoc 'exit' :oops:

Et cela donne les résultats :

Code : Tout sélectionner

115 m91 .      (saisi)
105.           (résultat)
89 m91 .       (saisi)
91.            (résultat)
Evidemment, comme tout est interprété, ça rame, le premier résultat est obtenu 'assez' rapidement (quelques secondes), mais le second se laisse désirer... voire se mérite (environ 1 minute !).
Cool (encore), non ?
G.E.

P.S. : jxano, j'ai copié ce "forth" sur ta TI89 aux Pockéticaires
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2918
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Misez p'tit, Optimisez - N°10 (hommage à J. McCarthy)

Message par zpalm »

zpalm a écrit :J’ai adapté le programme BASIC de Charo ( le premier celui avec le IF … THEN … GOTO, pas celui avec le FOR ... NEXT pour Sharp uniquement) et ça donne ça en FORTH sur le HP 71B:

Code : Tout sélectionner

: MCC 1 BEGIN DUP 0> WHILE
 OVER 100 > 2* + 1 +
 SWAP DUP 100 > 21 * + 11 + SWAP REPEAT
DROP ;
Une fois que l'on a défini le mot MCC en FORTH, on peut aussi l'exécuter à partir du BASIC:

Code : Tout sélectionner

     10 INPUT N@PRINT FORTHX "MCC .",N
Le BASIC du HP 71B, justement, est récursif.

Voici une version "lisible" utilisant la récursion:

Code : Tout sélectionner

     10 DEF FNM (N)
     20 IF N>100 THEN FNM=N-10 ELSE FNM=FNM(FNM(N+11))
     30 END DEF
     40 INPUT N@PRINT FNM(N)
Et voici une version un peu plus condensée:

Code : Tout sélectionner

     10 DEF FNM(N)=VAL("FNM(FNM(N+11))N-10"[1+14*(N>100),14+4*(N>100)])
     20 INPUT N@PRINT FNM(N)
cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2142
Enregistré le : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: Misez p'tit, Optimisez - N°10 (hommage à J. McCarthy)

Message par cgh »

zpalm a écrit :Et voici une version un peu plus condensée:

Code : Tout sélectionner

     10 DEF FNM(N)=VAL("FNM(FNM(N+11))N-10"[1+14*(N>100),14+4*(N>100)])
     20 INPUT N@PRINT FNM(N)
Puissant la fonction VAL du HP-71B 8O . En fait, elle évalue la chaîne de caractères et ne contente pas de transformer une chaine représentant un nombre en sa valeur. L'EVAL du RPL n'était pas loin...
Il y a ceux qui voient les choses telles qu'elles sont et se demandent pourquoi, et il y a ceux qui imaginent les choses telles qu'elles pourraient être et se disent... pourquoi pas? - George Bernard Shaw
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque
Avatar du membre
charognard
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4412
Enregistré le : 06 juin 2007 19:28
Localisation : Indre et loire
Contact :

Re: Misez p'tit, Optimisez - N°10 (hommage à J. McCarthy)

Message par charognard »

C.Ret a écrit :Bon, d'accord je change de méthode !

Voici de quoi chercher des poux dans les octets :

Il s'agit d'une version pour HP-97 / HP-67.
Le principe est simple, tout tien dans la pile, mais j'y met le nombre d'appels qui reste à effectuer; il est initalisé à 1 (puis est appelé c dans le tableau.
Comme tout dépen du test 'n>100', et pour éviter de le répéter, le drapeau (Flag 1) est utilisé. Il est baissé (clear) lorsque n<=100 et dressé (set) lorsque n>100.
...
Bizard !
ça me rappelle mon code en page 1 ça ;) (R c'est le FLAG)

Code : Tout sélectionner

10 INPUT N:R=1
20 IF R<1 THEN PRINT N
30 R=R+1-2*(N>100),N=N+11-21*(N>100):GOTO 20
billaj
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 383
Enregistré le : 09 avr. 2005 17:48
Localisation : Brest
Contact :

Re: Misez p'tit, Optimisez - N°10 (hommage à J. McCarthy)

Message par billaj »

billaj a écrit :
zpalm a écrit :Sur la HP-41 la pile de retour des sous-programmes a une profondeur de 6, ce qui veut dire que l’on ne peut revenir que 6 niveaux en arrière. Donc ça ne devrait pas marcher pour n <45!!

En fait on est sauvé car pour tout n <=90 la valeur est 91, donc lorsque l’on calcule par ex. M(5) on dépasse le nombre de niveaux autorisés, on ne revient donc pas au début des appels comme on peut le voir en passant en mode programme : le programme s’est arrêté sur le dernier RTN du programme. Mais la 41 affiche la bonne valeur : 91.
Autrement dit : Récursivité terminale FTW ! :mrgreen:
Je m'auto-cite pour annuler cette belle connerie que j'ai écrite ici : l'algorithme de la fonction M, nativement, n'est pas récursif terminal ! :oops:

La différence est pourtant simple : une fonction récursive terminale renvoie en toute dernière opération le résultat de l'appel récursif, tandis qu'une non terminale y applique ensuite d'autres traitements.

La fonction M est donc non terminale...elle serait terminale si pour n>100 on renvoyait M(n+11). Mais on renvoie M(M(n+11))...on a donc besoin du pointeur d'exécution dans le niveau actuel du programme pour, après avoir évalué M(n+11), évaluer M(ce nombre)...
...en fait, c'est assez intéressant, à chaque étape on enchaîne un appel non terminal M(n+11) auquel on applique l'appel terminal M(M(n+11)) !
Ceci revient à dire plus simplement qu'on a deux appels successifs, l'entrée du second étant la sortie du premier...

En termes d'implémentation, la différence récursivité non terminale/terminale devient ceci :
-Dans un cas, comme on post-traite le retour de l'appel récursif, on a besoin de garder en mémoire l'état de la fonction appelante : pointeur d'exécution, variables locales (en tout cas, celles encore utilisées par la suite)
-Dans l'autre, comme on ne fait que renvoyer tel quel le résultat de l'appel récursif (situation plus ou moins facile à détecter), on n'a besoin de rien conserver de la fonction appelante, pas même le pointeur d'exécution. Un interpréteur/compilateur malin tient compte de cette situation pour optimiser la gestion de la mémoire.

Ceci se traduit de deux façons différentes si on "itératifie"/"dérécursifie" l'algorithme :
-Dans un cas, il est nécessaire de garder des informations sur les itérations précédentes. Compteur ou autre information "synthétique" dans le meilleur des cas, pile de variables et d'ex-paramètres dans le pire (avec boucle/empilage pour les appels récursifs puis 2ème boucle inverse/dépilage pour le post-traitement)
-Dans l'autre, il ne va s'agir que de la réaffectation/écrasement de variables locales (les ex-paramètres) et d'un Goto.

Dans le cas de la fonction de McCarthy, comment cela se traduit-il ? On n'a pas de variable locale, la seule chose qu'on a à stocker lors de la première récursion (non terminale) est l'équivalent du pointeur de pile, on n'a même pas besoin de sauvegarder n. On fait ensuite un appel de la même fonction donc on a juste besoin de "savoir" dans laquelle des deux itérations on se trouve. Et comme pour ce deuxième appel on a simplement en entrée le résultat brut du premier appel, on n'a au final pas de traitement différencié entre les deux appels ni entre ceux-ci et ceux imbriqués et donc un simple compteur suffit pour dérécursifier la fonction ! La non-terminalité de l'ensemble se retrouvant dans le besoin d'avoir ce compteur au lieu d'un simple goto.

J'espère ne pas avoir écrit de grosse connerie...très intéressante cette fonction en tout cas ! :D


Autres réflexions sur le thème de la récursion :

Un truc assez intéressant à noter est que sur nos pockets où les variables sont en général statiques, la récursion dans un cas où on a des variables locales à stocker nous oblige malgré tout à gérer nous-même une pseudo-pile (sous forme de tableau), les pointeurs d'instruction en moins.

Un deuxième truc intéressant est de remarquer que ce modèle est justement celui selon lequel nos ordinateurs sont conçus et implémentent les appels récursifs. Dérécursifier revient donc à faire une partie du boulot du compilateur, en l'optimisant et en remplaçant la gestion de pile native du CPU par la nôtre.
Quand Chuck Norris joue à Nintendogs, il a automatiquement armes et munitions infinies.
Chuck Norris peut revenir en arrière dans Super Mario Land.
Chuck Norris utilise exclusiment des calculatrices Texas Instruments.
Avatar du membre
charognard
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4412
Enregistré le : 06 juin 2007 19:28
Localisation : Indre et loire
Contact :

Re: Misez p'tit, Optimisez - N°10 (hommage à J. McCarthy)

Message par charognard »

Aller plus visuel
voici le traitement pour N=50 avec I:Po:Pr:N
I = iterations
Po = Pointeur de pile
Pr = Profondeur pile recursive
N = valeur de N

Pourquoi ça fonctionne sur 41 ... simple la pile est limitée à 6 et dans le cas de notre fonction nous dépilons plus que 2 QUE DANS LE CAS TERMINAL
De plus même si ça ressemble à un programme récussif, il en est rien, aucune variable locale, N est calculé et écrasé à chaque itération et la subtilité est d'utiliser la sortie de programme par le dépilage final.

Code : Tout sélectionner

   1:P2:1:61
      2:P2:2:72
         3:P2:3:83
            4:P2:4:94
               5:P2:5:105
            6:P0:4:95
               6:P1:5:95
                  7:P2:6:106
               8:P0:5:96
                  8:P1:6:96
                     9:P2:7:107
                  10:P0:6:97
                     10:P1:7:97
                        11:P2:8:108
                     12:P0:7:98
                        12:P1:8:98
                           13:P2:9:109
                        14:P0:8:99
                           14:P1:9:99
                              15:P2:10:110
                           16:P0:9:100
                              16:P1:10:100
                                 17:P2:11:111
                              18:P0:10:101
                                 18:P1:11:101
                              19:P0:10:91
                           19:P0:9:91
                        19:P0:8:91
                     19:P0:7:91
                  19:P0:6:91 ---> C'est ICI que la HP41 s'arrête
               19:P0:5:91
            19:P0:4:91
         19:P0:3:91
            19:P1:4:91
               20:P2:5:102
            21:P0:4:92
               21:P1:5:92
                  22:P2:6:103
               23:P0:5:93
                  23:P1:6:93
                     24:P2:7:104
                  25:P0:6:94
                     25:P1:7:94
                        26:P2:8:105
                     27:P0:7:95
                        27:P1:8:95
                           28:P2:9:106
                        29:P0:8:96
                           29:P1:9:96
                              30:P2:10:107
                           31:P0:9:97
                              31:P1:10:97
                                 32:P2:11:108
                              33:P0:10:98
                                 33:P1:11:98
                                    34:P2:12:109
                                 35:P0:11:99
                                    35:P1:12:99
                                       36:P2:13:110
                                    37:P0:12:100
                                       37:P1:13:100
                                          38:P2:14:111
                                       39:P0:13:101
                                          39:P1:14:101
                                       40:P0:13:91
                                    40:P0:12:91
                                 40:P0:11:91
                              40:P0:10:91
                           40:P0:9:91
                        40:P0:8:91
                     40:P0:7:91
                  40:P0:6:91
               40:P0:5:91
            40:P0:4:91
         40:P0:3:91
      40:P0:2:91
         40:P1:3:91
            41:P2:4:102
         42:P0:3:92
            42:P1:4:92
               43:P2:5:103
            44:P0:4:93
               44:P1:5:93
                  45:P2:6:104
               46:P0:5:94
                  46:P1:6:94
                     47:P2:7:105
                  48:P0:6:95
                     48:P1:7:95
                        49:P2:8:106
                     50:P0:7:96
                        50:P1:8:96
                           51:P2:9:107
                        52:P0:8:97
                           52:P1:9:97
                              53:P2:10:108
                           54:P0:9:98
                              54:P1:10:98
                                 55:P2:11:109
                              56:P0:10:99
                                 56:P1:11:99
                                    57:P2:12:110
                                 58:P0:11:100
                                    58:P1:12:100
                                       59:P2:13:111
                                    60:P0:12:101
                                       60:P1:13:101
                                    61:P0:12:91
                                 61:P0:11:91
                              61:P0:10:91
                           61:P0:9:91
                        61:P0:8:91
                     61:P0:7:91
                  61:P0:6:91
               61:P0:5:91
            61:P0:4:91
         61:P0:3:91
      61:P0:2:91
   61:P0:1:91
      61:P1:2:91
         62:P2:3:102
      63:P0:2:92
         63:P1:3:92
            64:P2:4:103
         65:P0:3:93
            65:P1:4:93
               66:P2:5:104
            67:P0:4:94
               67:P1:5:94
                  68:P2:6:105
               69:P0:5:95
                  69:P1:6:95
                     70:P2:7:106
                  71:P0:6:96
                     71:P1:7:96
                        72:P2:8:107
                     73:P0:7:97
                        73:P1:8:97
                           74:P2:9:108
                        75:P0:8:98
                           75:P1:9:98
                              76:P2:10:109
                           77:P0:9:99
                              77:P1:10:99
                                 78:P2:11:110
                              79:P0:10:100
                                 79:P1:11:100
                                    80:P2:12:111
                                 81:P0:11:101
                                    81:P1:12:101
                                 82:P0:11:91
                              82:P0:10:91
                           82:P0:9:91
                        82:P0:8:91
                     82:P0:7:91
                  82:P0:6:91
               82:P0:5:91
            82:P0:4:91
         82:P0:3:91
      82:P0:2:91
   82:P0:1:91
82:P0:0:91
   82:P1:1:91
      83:P2:2:102
   84:P0:1:92
      84:P1:2:92
         85:P2:3:103
      86:P0:2:93
         86:P1:3:93
            87:P2:4:104
         88:P0:3:94
            88:P1:4:94
               89:P2:5:105
            90:P0:4:95
               90:P1:5:95
                  91:P2:6:106
               92:P0:5:96
                  92:P1:6:96
                     93:P2:7:107
                  94:P0:6:97
                     94:P1:7:97
                        95:P2:8:108
                     96:P0:7:98
                        96:P1:8:98
                           97:P2:9:109
                        98:P0:8:99
                           98:P1:9:99
                              99:P2:10:110
                           100:P0:9:100
                              100:P1:10:100
                                 101:P2:11:111
                              102:P0:10:101
                                 102:P1:11:101
                              103:P0:10:91
                           103:P0:9:91
                        103:P0:8:91
                     103:P0:7:91
                  103:P0:6:91
               103:P0:5:91
            103:P0:4:91
         103:;P0:3:91
      103:P0:2:91
   103:P0:1:91
103:P0:0:91
103:-:-:91 --> Affichage valeur terminale
Donc plus que de fournir le bon résultat par "hazard" il donne forcement le bon résultat

Par contre comment fonctionne la pile gosub HP 41 ?
les pointeurs de pile sont t'ils décalés à l'arrivée du 7eme P1=P2,P2=P3,P3=P4,P4=P5,P5=P6,P6=P7 ou seul P6=P7 ???
Je préssent le CAS 2 permet un raccourci de programmation mais pourra déranger dans des cas rares.

Plus qu'un bug HP41 c'est une solution assez réflechi ce choix HP qui permet quelques ruses ... La preuve sur ce post
Modifié en dernier par charognard le 30 oct. 2011 08:43, modifié 3 fois.
jxano
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2362
Enregistré le : 16 févr. 2008 23:34
Localisation : Paris 20ème

Re: Misez p'tit, Optimisez - N°10 (hommage à J. McCarthy)

Message par jxano »

gege a écrit :P.S. : jxano, j'ai copié ce "forth" sur ta TI89 aux Pockéticaires
Je crois que tu me l'avais déjà dit, mais j'ai dû oublier. Je ne tapote pas beaucoup en ce moment, du reste.
Programmeur abscons.
Répondre

Retourner vers « Tous les Pockets »