HP-48/49/50G : Quand le RPL rencontre APL

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

FLISZT
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 655
Enregistré le : 09 mars 2022 19:14

Re: HP-48/49/50G : Quand le RPL rencontre APL

Message par FLISZT »

Bonjour,

C.Ret, ton programme pèse 5 octets de moins que le mien, soit 56 octets.
C.Ret a écrit : 13 mai 2022 22:27 Au lieu de retourner tous les éléments du calcul, pourquoi ne pas faire le calcul dans l'autre sens ?
Si je n'ai pas fait le calcul dans l'autre sens, c'est sans doute parce que j'ai suivi le processus de réflexion habituelle : test de la divisibilité par 4, puis test de la divisibilité par 100, etc.
Je suis donc parti de mon avant-dernier programme - qq lignes plus haut - de 135 octets (!) que j'ai amélioré essentiellement en supprimant la variable locale, tout en lui conservant une certaine lisibilité.

Après, au jeu du « MPO », il y a bcp de « Siliciens » globalement meilleurs que moi. Si si… Non seulement je programme peu, mais MPOïser n'est probablement pas ma "faculté" la plus développée.
Non, ce que j'aime, c'est la clarté dans la confusion… ou dans le RPL, c'est pareil ! :lol:

Cependant, en suivant tes observations, j'ai pu très facilement descendre à 58,5 octets (au lieu de 61) :

Code : Tout sélectionner

«
	DUP 
	  4 MOD NOT
	    OVER
	      100 MOD
	        AND
	OVER
	  400 MOD NOT
	    OR			 
»

Rmq : OR ou XOR ⇒ même résultat           
… ce pgrm a le défaut (ou l'avantage) de conserver l'année testée au niveau 2 de la pile.

Puis en réfléchissant, càd en tâtonnant avec mes doigts sur le clavier (… une réflexion garantie 100% digitale :mrgreen: ), à "mes" opérateurs logiques (surtout aux "négatifs" :evil: ), je suis arrivé à ceci :

Code : Tout sélectionner

«
	DUP 
	  4 MOD NOT
	    OVER
	      100 MOD
	        AND
	OVER
	  400 MOD
	    XOR			 
»
…soit 56 octets cette fois.

Mais - car il y un mais - quand ce programme dit "oui" (1) il faut comprendre "non" (0) et inversement !
Bin oui…

J'ai alors pensé qu'on ne ferait sûrement pas bcp mieux - voire pas mieux du tout - que ce nos 56 octets, vu que les nombres et instructions
"4 MOD 100 MOD 400 MOD" réunis dans un même prgm représentent déjà 41 octets. C'est alors que je me suis remémoré une saine lecture…

« Et voilà » comme disent nos amis de langue anglaise :

Code : Tout sélectionner

«
	DUP 
	  4 MOD NOT
	    OVER
	      2 ALOG MOD
	        AND
	OVER
	  2 ALOG * 4 MOD
	    XOR			 
»
… 50 octets.

"plus" c'est "moins" ! C'est étrange le RPL, voire un peu vicieux, non ?
Bruno
Sanyo CZ-0124 ? TI-57 ? HP-15C ? Canon X-07 + XP-140 Monitor Card ? HP-41CX ? HP-28S ? HP-50G ? HP-50G
OlidaBel
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 106
Enregistré le : 04 avr. 2021 16:09
Localisation : 50.693165,4.573478

Re: HP-48/49/50G : Quand le RPL rencontre APL

Message par OlidaBel »

J'admire votre passion et votre soin quand vous expliquez vos réalisations, et tout ce code à retaper dans le forum... :P
Bonne journée à tout le monde. :)
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: HP-48/49/50G : Quand le RPL rencontre APL

Message par Schraf »

@FLISZT sur ma HP-50g, le programme suivant fait 46 octets
« {400 100 4} MOD OBJ→ DROP NOT AND XOR »
Le résultat étant également présenté sous la forme 1 = Non bissextile et 0 = Bissextile

Et en 46 octets pour une version plus intuitive (1 = Bissextile)
« {400 100 4} MOD OBJ→ XOR AND XOR NOT »
Explication : Lorsque les 3 modulos ont été calculés ({400 100 4} MOD), OBJ→ les met sur la pile et ajoute 3 au niveau 1 car il y a 3 éléments. A priori on voudrait supprimer ce 3 pour faire un NOT sur l'élément du niveau 2 (que l'on va appeler A). Mais comme on est certain que le niveau 1 sera égal à 3, on peut faire un 3 XOR A en remarquant que VRAI XOR A = NOT(A)
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2919
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: HP-48/49/50G : Quand le RPL rencontre APL

Message par zpalm »

Schraf a écrit : 15 mai 2022 12:17 Et en 46 octets pour une version plus intuitive (1 = Bissextile)
« {400 100 4} MOD OBJ→ XOR AND XOR NOT »
Cool ! Ça marche aussi sur la 48GX mais pas sur la 48SX qui ne supporte pas {400 100 4} MOD.
FLISZT a écrit : 14 mai 2022 09:40

Code : Tout sélectionner

«
	DUP 
	  4 MOD NOT
	    OVER
	      2 ALOG MOD
	        AND
	OVER
	  2 ALOG * 4 MOD
	    XOR			 
»
… 50 octets.
Sur ma 48SX ce programme retourne 0 pour 2000 alors qu’il devrait retourner 1
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: HP-48/49/50G : Quand le RPL rencontre APL

Message par Schraf »

@zpalm : je pense qu'il s'est trompé en tapant le programme, c'est 4 * et pas * 4.

Sur HP-48G mon programme fait 53.5 octets, donc plus que celui de @FLISZT mais 46.5 sur HP 50g (en utilisant la commande BYTES). Son programme fait d'ailleurs aussi 46.5 octets sur HP 50g sauf qu'il donne la négation de la réponse 😜
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: HP-48/49/50G : Quand le RPL rencontre APL

Message par C.Ret »

zpalm a écrit : 15 mai 2022 14:40
FLISZT a écrit : 14 mai 2022 09:40

Code : Tout sélectionner

« DUP 4 MOD NOT OVER 2 ALOG MOD AND OVER 2 ALOG * 4 MOD  XOR »
… 50 octets.
Sur ma 48SX ce programme retourne 0 pour 2000 alors qu’il devrait retourner 1
Schraf a écrit : 15 mai 2022 15:14@zpalm : je pense qu'il s'est trompé en tapant le programme, c'est 4 * et pas * 4.
Oui, je pense aussi, ce serai plus logique. Mais il faut aussi ajouter un NOT à la fin car sinon tous les résultats sont inversés par rapport à notre convention 1 = 'année bissextile'.

Code : Tout sélectionner

« DUP 4 MOD NOT OVER 2 ALOG MOD AND OVER 2 ALOG 4 * MOD XOR NOT »
C.Ret a écrit : 13 mai 2022 22:27

Code : Tout sélectionner

«  DUP 400 MOD 
  OVER 100 MOD XOR
  SWAP   4 MOD XOR NOT »
C'est bien, mais on peut mieux faire ; inverser l'ordre des test 100 et 400, remplacer 100 par 2 ALOG ou utiliser LAST :

Code : Tout sélectionner

«  DUP  2  ALOG  MOD  LAST  4  *  MOD  XOR  SWAP  4  MOD  XOR  NOT  »

Sur HP-28S, pas de possibilité de regrouper les arguments dans une liste pour n'utiliser qu'un seul MOD :(

BON mais TANPIS... ;"(

Mais, on peux ne faire que deux MOD :

Code : Tout sélectionner

« 4 MOD                   // SI divisible par 4 ?
    0                       // ALORS   '0' == non alors pas bissextile
      LAST SWAP 1 % FP        // SINON: divisible par 100 ?
      LAST ROT MOD NOT XOR    //      sans  être divisible par 400 ?
  IFTE »
Modifié en dernier par C.Ret le 15 mai 2022 17:53, 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
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: HP-48/49/50G : Quand le RPL rencontre APL

Message par Schraf »

@C.Ret

Code : Tout sélectionner

«  DUP  2  ALOG  MOD  LAST  4  *  XOR  SWAP  4  MOD  XOR  NOT  »
Pour 1900, le programme retourne 1 au lieu de 0 :

Code : Tout sélectionner

1:1900 	2:1900			DUP
1:2	2:1900	3:1900		2
1:100	2:1900	3:1900		ALOG
1:0	2:1900			MOD
1:100	2:1900	3:0	4:1900	LAST
1:4	2:100	3:1900	4:0	4
1:400	2:1900	3:0	4:1900	*
1:0	2:0	3:1900		XOR
1:0	2:0	3:1900		SWAP
1:4	2:0	3:0	4:1900	4
1:0	2:0	3:1900		MOD
1:0	2:1900			XOR
1:1				NOT
Sinon, version pour HP-50G (42.5 octets 🥵) et HP-48G (désolé pour les 48S et 28C/S) :

Code : Tout sélectionner

« 4 2 ALOG DUP2 * 3 →LIST MOD NOT OBJ→ DROP SAME AND »
SAME peut être remplacé par == et AND par *.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: HP-48/49/50G : Quand le RPL rencontre APL

Message par C.Ret »

Schraf a écrit : 15 mai 2022 16:59 @C.Ret

Code : Tout sélectionner

«  DUP  2  ALOG  MOD  LAST  4  *  MOD   XOR  SWAP  4  MOD  XOR  NOT  »
Pour 1900, le programme retourne 1 au lieu de 0 :
Pas sur mon HP-28S en tout cas, j'obtiens bien 0 pour l'année 1900 !!
Mais attention, il y a un MOD après la multiplication par 4 !?

Code : Tout sélectionner

  DUP                                              1900        1900
  2                                    1900        1900           2
  ALOG                                 1900        1900         100
  MOD                                              1900           0
  LAST                     1900           0        1900         100
  4            1900           0        1900         100           4
  *                        1900           0        1900         400
  MOD                                  1900           0         300
  XOR                                              1900           1
  SWAP                                                1        1900
  4                                       1        1900           4
  MOD                                                 1           0
  XOR                                                             1
  NOT                                                             0
Schraf a écrit : 15 mai 2022 16:59Sinon, version pour HP-50G (42.5 octets 🥵) et HP-48G (désolé pour les 48S et 28C/S) :

Code : Tout sélectionner

« 4 2 ALOG DUP2 * 3 →LIST MOD NOT OBJ→ DROP SAME AND »
SAME peut être remplacé par == et AND par *.
C'est exactement ce que j'essaie de faire sur mon pauvre HP-28S depuis une heure. Mais ces fonctions de base sont si démunies que cela produit des monstres !

Mais tout cela nous éloigne un peu de l'APL. C'est ce dernier qui nous avait amener à composer ces code en RPL.

Je continue donc les oscillations en proposant le code APL suivant pour détecter si une année est bissextile :

Code : Tout sélectionner

~≠/×400 100 4| YYYY                où YYYY est un scalaire donnant 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.
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: HP-48/49/50G : Quand le RPL rencontre APL

Message par Schraf »

@C.Ret : Oups, j'ai oublié le MOD en tapant ton programme, ceci explique cela ! 😅

J'aime bien ta version en APL, on peut la généraliser pour un vecteur d'années :

Code : Tout sélectionner

~≠⌿× 400 100 4 ∘.| 1900 1904 2000 2003 2004
		    0 	 1    1    0    1
Le ⌿ c'est pour faire une réduction par colonne

Code : Tout sélectionner

×400 100 4∘.| 1900 1904 2000 2004
1 1 0 1
0 1 0 1
0 0 0 0

+⌿×400 100 4∘.| 1900 1904 2000 2004
1 2 0 2
Et ça donne aussi une autre idée en RPL, mais cela fait 57 octets :

Code : Tout sélectionner

« { 400 100 4 } MOD NOT « ≠ » STREAM »
FLISZT
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 655
Enregistré le : 09 mars 2022 19:14

Re: HP-48/49/50G : Quand le RPL rencontre APL

Message par FLISZT »

Effectivement, j'ai inversé « 4 » et « * » en saisissant mon prgm spécialement pensé pour hp-28.
Le fait d'aimer la hp-50g ne m'empêche pas d'aimer bcp ma hp-28s, il ne faut pas croire. :D

Version "décoquillée" :

Code : Tout sélectionner

«
	DUP 
	  4 MOD NOT
	    OVER
	      2 ALOG MOD
	        AND
	OVER
	  2 ALOG 4 * MOD
	    XOR			 
»
Sinon "0 ou 1", "1 ou 0"… j'ai bien précisé que ce prgm renvoyait "0" pour "oui" et "1" pour "non".
Je l'ai testé avec 1900 (1), 1963 (1), 1988 (0) et 2000 (0).

Bravo Schraff !!! 8O
:D
J'avais eu peur retrospectivment d'avoir "un peu" spoilé ton fil, mais je constate que finalement j'ai juste remis une pièce dans la machine…
… et c'est reparti ! :D
Bruno
Sanyo CZ-0124 ? TI-57 ? HP-15C ? Canon X-07 + XP-140 Monitor Card ? HP-41CX ? HP-28S ? HP-50G ? HP-50G
FLISZT
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 655
Enregistré le : 09 mars 2022 19:14

Re: HP-48/49/50G : Quand le RPL rencontre APL

Message par FLISZT »

Bravo également à toi C.Ret !!! :D

Je constate que ton programme 100% hp-28s…
C.Ret a écrit : 15 mai 2022 16:35

Code : Tout sélectionner

« DUP 4 MOD NOT OVER 2 ALOG MOD AND OVER 2 ALOG 4 * MOD XOR NOT »
… ne pèse que fait 45 octets !!! 8O

Mais je ne devrais pas être surpris…
FLISZT a écrit : 14 mai 2022 09:40 Après, au jeu du « MPO », il y a bcp de « Siliciens » globalement meilleurs que moi. (…)
Comme l'a dit le grand philosophe sino-américain Lao Callahan Zi : « L'homme sage est celui qui connait ses limites. »
:wink:
Bruno
Sanyo CZ-0124 ? TI-57 ? HP-15C ? Canon X-07 + XP-140 Monitor Card ? HP-41CX ? HP-28S ? HP-50G ? HP-50G
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: HP-48/49/50G : Quand le RPL rencontre APL

Message par C.Ret »

Schraf a écrit : 15 mai 2022 19:06 J'aime bien ta version en APL, on peut la généraliser pour un vecteur d'années :

Code : Tout sélectionner

~≠⌿× 400 100 4 ∘.| 1900 1904 2000 2003 2004
		    0 	 1    1    0    1
Le ⌿ c'est pour faire une réduction par colonne

Code : Tout sélectionner

×400 100 4∘.| 1900 1904 2000 2004
1 1 0 1
0 1 0 1
0 0 0 0

+⌿×400 100 4∘.| 1900 1904 2000 2004
1 2 0 2
Et ça donne aussi une autre idée en RPL, mais cela fait 57 octets :

Code : Tout sélectionner

« { 400 100 4 } MOD NOT « ≠ » STREAM »
C'est clair, je doit encore étudier mon APL et faire plus d'exercices (corrigés), je n'ai pas encore les réflexes qu'il y faut. Cette histoire de généralisation m'a fait devenir chèvre. Bien. Je vais passer encore un peu de temps en APL, c'est tout de même l'ancêtre de Mathlab (tm) et sur ce langage je suis maintenant un peu rouillé aussi; pourtant c'est pas faute d'y avoir passer des heures. D'ailleurs j'ai lu dernièrement que l'APL a bien failli s'appeler ainsi.

STREAM, chaque fois que je parcours une ligne APL, je pense à cette instruction du RPL, en APL il n'y a pas de structure de boucle et d'avoir composé un code qui ne marche que pour un scalaire unique, je trouvais ça pas très dans l'esprit du langage.
FLISZT a écrit : 15 mai 2022 20:52Je constate que ton programme 100% hp-28s…
… ne pèse que fait 45 octets !!! 8O
[...]
Comme l'a dit le grand philosophe sino-américain Lao Callahan Zi : « L'homme sage est celui qui connait ses limites. »
Oui, la version précédente de ce code pour HP-28S n'était pas optimisée, je cherchais juste à reproduire l'algorithme utilisé en APL.

Connais pas ce Lao Callahan ??! C'est un Docteur en Philosophie, comme moi ?
Quand à mes limites réelles, je les connais fort bien, elles tiennent toutes dans l'interval [ -1.E-499 , 9.99999999999E499 ] ; c'est de la philosophie de poche très pratique modèle américain fabriquée à Singapour. Peut-être par ce Lao Callahan ?
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
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: HP-48/49/50G : Quand le RPL rencontre APL

Message par Schraf »

@C.Ret : Sur ce forum j'ai surtout présenté APL en utilisant les "direct functions", c'est-à-dire avec des accolades { }, ⍺ et ⍵. C'est propre à Dyalog APL, on ne trouvait pas ça dans les versions APL, APL2, APL*PLUS des années 90 et avant.

Donc effectivement faire des boucles avec les "direct functions" c'est pas spécialement adapté.

On peut revenir à du classique où l'on voit les branchements :

Code : Tout sélectionner

  ∇ BISS;A
[1] DEB:A←⎕
[2] → ((A=0),(≠/×400 100 4|A)) / 7,NRM
[3] 'BISS'
[4] → DEB
[5] NRM:'NORM'
[6] → DEB
[7] 'FIN' ∇
Démonstration en vidéo sur simulateur IBM 5110
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: HP-48/49/50G : Quand le RPL rencontre APL

Message par Gilles59 »

Merci Schraf pour tes articles APL ! J'en ai vu un autre où tu traite du dernier MPO mais je ne retrouve pas la rubrique :/
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
FLISZT
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 655
Enregistré le : 09 mars 2022 19:14

Re: HP-48/49/50G : Quand le RPL rencontre APL

Message par FLISZT »

Gilles, c'est dans la rubrique Émulateurs.

Misez p'tit Optimisez en version APL
Bruno
Sanyo CZ-0124 ? TI-57 ? HP-15C ? Canon X-07 + XP-140 Monitor Card ? HP-41CX ? HP-28S ? HP-50G ? HP-50G
Répondre

Retourner vers « Tous les Pockets »