Misez p'tit, Optimisez - N°15 (le jour des fourmis)

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
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3625
Enregistré le : 06 sept. 2011 14:57
Localisation : Normandie

Re: Misez p'tit, Optimisez - N°15 (le jour des fourmis)

Message par Hobiecat »

badaze a écrit :C'est quand même beaucoup plus compréhensible en Basic. Pour moi le RPL c'est de l'Aldébaranais !!!
C'est la force du Basic : on comprend vite ce qu'un autre à programmé. Je me souviens que du temps de l'Op, on pouvait adapter facilement les programmes Basic de n'importe quelle machine à sa propre machine. Tous les langages machines étaient beaucoup plus "délicats" pour l'adaptation. Et heureusement, le RPL n'existait pas à l'époque ! :mrgreen:

On pourrait presque classer les langages suivant ces deux paramètres, puissance et "lisibilité" ! :wink:
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Misez p'tit, Optimisez - N°15 (le jour des fourmis)

Message par Gilles59 »

badaze a écrit :C'est quand même beaucoup plus compréhensible en Basic. Pour moi le RPL c'est de l'Aldébaranais !!!
Aldébarien plutôt non ? En dialecte sud-aldébarien :

Code : Tout sélectionner

«
 Chars SORT REVLIST DUP Nub ">" ROT + 
  2 «  <> { 1 } { 1 + } IFTE » DOSUBS
 SWAP ADD Strcat
»
L'idée c'est :

"5233"
->
{"5" "2" "3" "3"} @ Chars
->
{"5" "3" "2"} @ Tri inverse et supprime les doubles SORT REVLIST Nub
{ 1 2 1 } @ Compte le nbr d'éléments successifs identique, c'est la séquence DOSUBS (je passe les détails lol )
->
"152312" @ On concatène élément par élement les 2 listes et transform en en chaine soit : ADD Strcat, avec le SWAP pour être dans le bon sens

Certes , c'est peu lisible. Je pense que le principe en RPL , c'est de combiner des petit programme et de bien commenter ce que çà attends sur l pile en entrée et ce qui est sur la pile en sortie. Après plus besoin de relire :twisted: :mrgreen:
Modifié en dernier par Gilles59 le 27 févr. 2012 22:12, modifié 4 fois.
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
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3625
Enregistré le : 06 sept. 2011 14:57
Localisation : Normandie

Re: Misez p'tit, Optimisez - N°15 (le jour des fourmis)

Message par Hobiecat »

Gilles59 a écrit :L'idée c'est ...
Merci pour cet éclaircissement, ça aide à la compréhension du code RPL ! :wink:
Avatar du membre
badaze
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 8372
Enregistré le : 12 févr. 2007 18:36
Localisation : Pas très loin de Lyon
Contact :

Re: Misez p'tit, Optimisez - N°15 (le jour des fourmis)

Message par badaze »

Hobiecat a écrit :
Gilles59 a écrit :L'idée c'est ...
Merci pour cet éclaircissement, ça aide à la compréhension du code RPL ! :wink:
On dirait que c'est écrit au hasard.
Faut être tordu pour écrire dans ce langage..... Mais tout de même moins que ceux qui l'ont conçu.
;)
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
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3400
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit, Optimisez - N°15 (le jour des fourmis)

Message par C.Ret »

Oui, mais Gills59 pratique un dialecte particulièrement gratiné du RPL. Nous, gens du Nord ne pratiqouns pas le sud-aldébarien du RPL. Trop dur et avec notre accent, on comprend rien !
:o

Nous ici au nord nous pratiquons un dialecte beaucoup plus basic :

LESSON n°1 : le RPL c’est du BASIQUE

Code : Tout sélectionner

10 : DIM N(9)                              
15 : INPUT "X0=";T$                        « ->STR -> T 
20 : FOR I=0 TO 9:N(I)=0:NEXT I                « { 10 } 0 CON  -> N
25 : FOR I=1 TO LEN(T$)                            « 1 T SIZE FOR i
30 :    C%=VAL(MID$(T$,I,1))                           T i i SUB STR-> -> c
35 :    N%(C%)=N%(C%)+1                                 « 'N(c)' 1 STO+ »
40 : NEXT I                                          NEXT
40 : T$=""                                           ""
45 : FOR I=9 TO 0 STEP -1                            9 0 FOR i
50 : IF N%(I)>0                                        IF N i GET 0 >
     THEN T$=T$+MID$(STR$(N%(I)),2)+CHR$(48+I)         THEN N i GET ->STR + i ->STR + END
55 : NEXT I                                          -1 STEP
60 : PRINT T$                                      »
65 : GOTO 20                                    »
                                            »  ‘ROBIN’ STO
Equivalences :
-------------------
INPUT et -> l’instruction de saisie et d’affectation se traduit directement par la création d’une variable locale à l’aide de la flèche -> qui retire la valeur de la pile. Comme la fonction INPUT attend une chaine de caractère (T$), on prend le soin avant de transformer en chaine par ->STR.

DIM déclare un tableau, CON construit un vecteur ou une matrice, c’est pareil. On indique la dimension entre crochet (ici {10]) et la valeur initiale (ici 0). On utilise la flèche pour mémoriser ce tableau (vecteur en fait car une seule dimension) dans la variable locale au programme N.

LEN et SIZE pour une chaine de caractères.

FOR se traduit par FOR. C’est bien pratique, mais le RPL est comme le RPN, il faut inverser l’ordre des arguments.

VAL qui devient STR-> et qui rend le même service pour les nombres. VAL est l’instruction inverse de STR$, comme STR-> l’inverse de ->STR. Mais comme expliqué plus loin, les instructions RPL sont plus généralistes.

MID$ et SUB pour les chaines de caractère l’instruction SUB va rendre les mêmes services que MID$ mais là aussi il faut faire attention à l’ordre des arguments qui se trouve bien évidemment avant l‘apple’ de l’instruction (et dans l’ordre strictement établit par sa syntaxe).

= en tant qu’affectation n’existe pas sur un système RPL, car comme ses très dignes ancêtres RPN, les RPL n’ont pas d’égale – tout au moins pour l’affectation car il y a un symbole = pour traiter les égalités et équations. On notera l’utilisation de STO+ comme avec les RPN, bien pratique.

NEXT et NEXT même position, même effet.

LET T$="" qui sera traduit sans affectation, pourquoi mémoriser un objet qui ne sera pas réutilisé. Surtout qu’en plus c’est la chaine qui sera retournée à la fin du programme. Laissons la donc à sa place au sommet de la pile.

IF ... THEN qui devent IF ... THEN ... END. Il faut bien délimiter la fin de la clause, car contrairement au BASIC, il n’y a pas de notion de fin de ligne. Sinon, structure de plsu similaire (mais pas identique).

STR$ et ->STR pour convertir nombre en chaine de caractère. En fait tout objet (vecteur, matrice, nombre, liste, etc). Le RPL a bien d’autres types d’objet que le BASIC n’a pas et les mêmes instructions s’appliquent en général à de multiples types.

N(i) qui devient N i GET. L’instruction GET permet d’extraire l’i-ème objet d’une liste ou collection. Cela s’applique aussi bien au élément d’un vecteur, d’une matrice, d’une liste, etc. On aurait pû utiliser une syntaxe algébrique, plus proche du BASIC en utilisant par exemple ‘N(i)’ EVAL ou ‘N(i)’ ->NUM. Le EVAL ou ->NUM sont nécessaire car le RPL est capable de calcul formel et donc l’expression ‘N(i)’ ne sera pas implicitement évalué sauf si l’on en donne explicitement l’ordre (EVAL) ou qu’une valeur numérique est requise (->NUM).

STEP correspond à STEP, mais contrairement au BASIC, il faut là aussi veiller à donner les arguments avant l’appel de l’instruction qui de plus doit être placée en lieu et place du NEXT. Il y une différence fondamentale entre les deux STEP, en BASIC on ne peut pas changer le pas en cours de boucle. EN RPL, le pas peut être adapté à chaque passage.

Et enfin le STO qui est utilisé pour mémoriser le programme, contrairement aux systèmes BASIC, les RPL peuvent stocker en mémoire toute sorte d’objets en mémoire organisée comme un arbre, chaque branche de l’arbre ayant accès aux objets situé dans les branches qui les portent jusqu’aux objets se trouvant dans la racine.
En BASIC, il n’ya en général qu’une seule zone de mémoire programme et il faut avoir un lecteur de disquette ou de disque pour organiser les programmes en arbre à l’aide des commande LOAD SAVE DIRECTORY etc. Mais contrairement au RPL, les programmes n’ont pas accès directement aux autres programmes ou objet de l’arborescence.


Bon, demain je ferais la lesson suivante :

LESSON n°2 : LE RPL c’est du RPN

Gilles59 a déjà dans ce forum démontré le contenu de la leçon n°3

LESSON n°3 : Le RPL c’est du LISP

Et Forthman ne démentira pas le sujet de la leçon n°4 :

LESSON n°4 : Le RPL c’est du Forth

Reste à trouver un volontaire pour traiter le sujet suivant;

LESSON n°5 : Le RPL language orienté objet

Travaux Pratiques : Ceux qui suivent Silicium depuis quelques temps save aussi que le RPL c'est du LOGO et que l'on peut dessiner des fractales et autres flocons de Koch.

CONCLUSION : c'est pas du hasard.

D.M.: (à rendre pour le prochain cours) Trouver et corriger le bug qui s'est glissé dans le programme RPL de la leçon n°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
ledudu
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5622
Enregistré le : 26 mars 2009 13:07
Localisation : Ile de France
Contact :

Re: Misez p'tit, Optimisez - N°15 (le jour des fourmis)

Message par ledudu »

Machine : Casio Pro FX-1
Langage : Fortran

Résoudre ce MPO en Fortran ressemblait à une gageure en raison du nombre restreint de pas disponibles sur cette machine.
En effet, elle affiche 127 pas mais une simple instruction du genre A=1 prend 3 pas en langage TI

Code : Tout sélectionner

1 STO A
Mais prend 5 pas en Fortran Casio :

Code : Tout sélectionner

1=K1:
Je me suis lancé en me rendant compte que le problème pouvait être simplifié en utilisant les registres et deux étapes.
Première étape : analyse de l'élément N de la suite :
L'élément N est dans le registre 8.
J'utilise les registres 0 à 4 pour stocker le nombre de 0, de 1, de 2, de 3, et de 4.
Ainsi, le nombre 3110 est analysé de droite à gauche et je fais +1 dans les registres 0 puis 1 puis 1 puis 3.
Pour cela, j'utilise l'adressage indirect grâce au registre I qui prend l'adresse du registre à incrémenter.

Deuxième étape : production de l'élément N+1 de la suite :
Je reconstruis dans le registre 8 l'élément N+1 en parcourant les registres de 4 à 0 grâce encore au registre indirect I.

Malgré tout, il m'a fallu batailler pour gagner les derniers octets permettant de faire tenir l'algorithme dans la machine.
J'ai même deux pas de rab à la fin :)

Remarques :
Le registre 9 sert à simuler la fonction int() comme d'habitude. Int (n)=n+9-9.
Il faut l'initialiser hors du programme à 10^10. Tous les autres registres étant à 0 au début.
Les registres 6 et 7 sont des registres de travail.
Le registre 5 contient 0 et permet de gagner de précieux pas (sinon, il faut utiliser K0 et dépenser deux pas).
Je suis limité à 8 digits, au delà la machine passe en notation ingénieur (pas d'alpha, bien sûr).

Code : Tout sélectionner

V4: 125 pas - 13 instructions + 6 labels
ST#0 : 6 = 8  / K10 + 9 - 9 : 7 = 6 +/- x K10 + 8 : 8 = 6 : I = 7 : IM = IM + K1 : IF 8 = 5:0:1:0:
ST#1 : I = K5:
ST#2 : I = I - K1 : IF IM = 5:4:4:3:
ST#3 : 8=K10 x 8 + IM x K10 + I : IM=5:
ST#4 : IF I = 5:5:5:2:
ST#5 : ANS 8:
En écrivant le code, je vois encore quelques octets à gagner. Le registre 6 est inutile.
Je récupère le registre 6 pour stocker la valeur 10 dont j'ai besoin 5 fois et économiser 4 octets de plus.
Du coup, je peux intégrer l'initialisation du registre 9 dans le programme et descendre à 123 pas.

Code : Tout sélectionner

V5 : 123 pas - 14 instructions + 6 labels
6 = K10 : 9 = 6 10^x:
ST#0 : 7 = 8  / 6 + 9 - 9 : I = 7 +/- x 6 + 8 : 8 = 7 :IM = IM + K1 : IF 8 = 5:0:1:0:
ST#1 : I = K5:
ST#2 : I = I - K1 : IF IM = 5:4:4:3:
ST#3 : 8=8 x 6 + IM x 6 + I : IM=5:
ST#4 : IF I = 5:5:5:2:
ST#5 : ANS 8:
Je gagne encore 3 octets en ne stockant pas le registre 9 mais en utilisant 6 10^x directement.
En effet, la fonction 10^x s'applique uniquement à l'affichage - alors que les 4 opérations ne gèrent pas la priorité.
C'est à dire que 3+4*5 font 35 et non pas 23 alors que 1+2 10 ^x font 201 et pas 300.
Dans le label 3 :
8 x 6 + IM x 6 + I = (8*k10+IM)*K10 +I=(8*K100)+(IM*K10)+I.

:arrow: 7 pas de rab, c'est byzance. 9a me rappelle le bon vieux temps de ma TI-57 et de ses 50 pas.

Code : Tout sélectionner

V5 : 120 pas - 13 instructions + 6 labels
6 = K10 : 
ST#0 : 7 = 8  / 6 + 6 10^x - 6 10^x : I = 7 +/- x 6 + 8 : 8 = 7 :IM = IM + K1 : IF 8 = 5:0:1:0:
ST#1 : I = K5:
ST#2 : I = I - K1 : IF IM = 5:4:4:3:
ST#3 : 8=8 x 6 + IM x 6 + I : IM=5:
ST#4 : IF I = 5:5:5:2:
ST#5 : ANS 8:
Utilisation : presser START à chaque affichage d'un élément de la suite pour avoir le suivant.

Image

D'autres programmes pour PRO Fx-1.
Modifié en dernier par ledudu le 12 mars 2017 17:25, modifié 15 fois.
Avatar du membre
Thierry Loiseau
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 823
Enregistré le : 10 avr. 2004 22:23
Localisation : Terrasson (Périgord)
Contact :

Re: Misez p'tit, Optimisez - N°15 (le jour des fourmis)

Message par Thierry Loiseau »

C.Ret a écrit :Donc, pour une première fois, je présenterais le code en scannant le listing. Ce qui m'évite toute faute de frappe !
(...)

Et même si ce n'est pas tout à fait l'usine à gaz dont parlait très justemetn Hobicat, if fait tout de même 54 pas.

Dommage, j'aurais bien aimé voir ces scans qui n'apparaissent pas chez moi :(
HP-41C, HP-12C ; Casio FX-702P, FX-850P, FX-602P, FX-3900P, FX-4000P, FX-180Pv ;
TI 57 avec adaptation d'une pile LR9 et une originale, accus HS; Newton MP 120FR, MP 2100US, MP 130US...
[***Apple //e, 7100, 8500, Atari Mega ST1 ***], PB-540c, PISMO, [***CPC-6128, MO5***]... et bien d'autres trucs

[--- plus ---]
http://astrophoto.free.fr/
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3400
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit, Optimisez - N°15 (le jour des fourmis)

Message par C.Ret »

Chez moi non-plus, je restaure ces uploads dès que possible (en fait ce soir quand j'aurai accés au disque qui contient la sauvegarde)
robinx.png
robinx.png (40.85 Kio) Vu 4693 fois
robin2.png
robin2.png (29.28 Kio) Vu 4693 fois
Modifié en dernier par C.Ret le 23 mars 2022 21:04, modifié 1 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
Thierry Loiseau
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 823
Enregistré le : 10 avr. 2004 22:23
Localisation : Terrasson (Périgord)
Contact :

Re: Misez p'tit, Optimisez - N°15 (le jour des fourmis)

Message par Thierry Loiseau »

Oh lala ! Merci pour le re-re-souvenirs !! Mais maintenant, il me faudra comprendre l'énigme du problème et c'est pas gagné :(

Image
HP-41C, HP-12C ; Casio FX-702P, FX-850P, FX-602P, FX-3900P, FX-4000P, FX-180Pv ;
TI 57 avec adaptation d'une pile LR9 et une originale, accus HS; Newton MP 120FR, MP 2100US, MP 130US...
[***Apple //e, 7100, 8500, Atari Mega ST1 ***], PB-540c, PISMO, [***CPC-6128, MO5***]... et bien d'autres trucs

[--- plus ---]
http://astrophoto.free.fr/
Ben
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1549
Enregistré le : 21 août 2016 19:04

Re: Misez p'tit, Optimisez - N°15 (le jour des fourmis)

Message par Ben »

Il me semble que je n'ai pas vu de version pour des petits pockets

Une version pour le PB-100. Il a quelques instructions de gestion de chaîne de caractères, enfin, c'est la base:

Code : Tout sélectionner

5 VAC:N$="0":O$="1":P$="2":Q$="3":R$="4":S$="5":T$="6"
6 U$="7":V$="8":W$="9"
10 INPUT $
20 FOR A=1 TO LEN($)
30 B$=MID(A,1):C=VAL(B$):D(C)=D(C)+1
40 NEXT A
45 $=""
50 FOR A=9 TO 0 STEP -1:IF D(A)=0 THEN 60
55 X=D(A):$=$+N$(X)+N$(A):D(A)=0
60 NEXT A
70 PRINT $:GOTO 20
On peut convertir du caractère en numérique avec l'instruction VAL(), mais je n'ai pas trouvé le moyen de faire l'inverse. D’où la présence du tableau N$()

C'est le premier jet, il y a déjà moyen de ressembler des lignes, histoire de gagner quelques K :-)

Ben
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 498
Enregistré le : 05 mars 2020 20:45
Contact :

Re: Misez p'tit, Optimisez - N°15 (le jour des fourmis)

Message par Schraf »

Suite de Robinson sur TI-80 et plus récentes :

Code : Tout sélectionner

PROGRAM:MPO15
INPUT L₁
LBL 1				# On compte les 0, 1,..., 9
SEQ(SUM(L₁=A-1),A,1,10,1→L₂	# TI récentes : suite(som(L₁=A-1),A,1,10→L₂
1→X:1→DIM(L₁
FOR(A,1,10			# Création de la nouvelle liste
IF 0<L₂(A:THEN
L₂(A→L₁(X:A-1→L₁(X+1:2+X→X
END
END
DISP L₁:PAUSE 
GOTO 1
MPO15 - TI.png
MPO15 - TI.png (9.02 Kio) Vu 4716 fois
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 498
Enregistré le : 05 mars 2020 20:45
Contact :

Re: Misez p'tit, Optimisez - N°15 (le jour des fourmis)

Message par Schraf »

Comme j'en ai parlé ici, je m'intéresse maintenant au K, un langage dérivé de l'APL, et plus particulièrement à sa version pocket (à installer sur un téléphone par exemple).

J'ai repris quelques idées (c'était il y a 10 ans !) de @Gilles59 où son programme (pour HP 49/50g) et utilisant la bibliothèque GoferList était :

Code : Tout sélectionner

«
 Chars SORT REVLIST DUP Nub ">" ROT + 
  2 «  <> { 1 } { 1 + } IFTE » DOSUBS
 SWAP ADD Strcat
»
ainsi que ma version en APL un peu longue. Finalement, en K j'arrive à :

Code : Tout sélectionner

 MPO15:{,/(#:'.s),'!s:=x[<x]}\
Seule restriction, il faut 2 chiffres pour le démarrage, par exemple 1 0. Le programme s'arrête tout seul quand la suite est stationnaire :

Code : Tout sélectionner

 MPO15 1 0
(1 0
 1 0 1 1
 1 0 3 1
 1 0 2 1 1 3
 1 0 3 1 1 2 1 3
 1 0 4 1 1 2 2 3
 1 0 3 1 2 2 1 3 1 4
 1 0 4 1 2 2 2 3 1 4
 1 0 3 1 3 2 1 3 2 4
 1 0 3 1 2 2 3 3 1 4)
Image

Je donne quelques explications ci-dessous (pour en savoir plus su oK c'est par là) :

- x[<x] permet de trier les valeurs, par exemple 1 0 3 1 devient 0 1 1 3
- Le "=" fait les statistiques (compte le nombre d'occurrences de chaque valeur)
- On mémorise dans "s" qui se retrouve être un dictionnaire donnant les positions, par exemple 1 0 3 1 donnera 0 1 3!(0 ; 1 2 ; 3). En effet dans 0 1 1 3, le "0" est à la position 0, le "1" aux positions 1 et 2 et le "3" à la position 3
- Les caractères ! et . permettent de récupérer les valeurs et les clés d'un dictionnaire
- La virgule pour la concaténation, l'apostrophe pour dire "pour chaque" et le # pour compter
- Le symbole \ à droite est extraordinaire puisqu'il permet de boucler la fonction entre accolades tant que le résultat n'est pas stable !

En français, on pourrait donc dire : Tant que le résultat n'est pas stable, trier les éléments par ordre croissant, compter les occurrences des chiffres distincts puis concaténer l'effectif avec la valeur.
Répondre

Retourner vers « Tous les Pockets »