Danny a écrit : ↑11 mai 2021 23:35
Sympa.
[...]
J’aurais aimé intégrer le
p = s.find("0") dans le test du while pour éviter de le dupliquer, mais ça n’a pas l’air possible avec Python…
Dommage, avec d’autres langages c’est faisable.
[...]
Ce MPO est effectivement très sympa.
Dans d'autre langage, j'ai eu le même souci que toi en cherchant à intégrer le FIND dans la clause du WHILE ... en RPL.
Pour éviter de répéter le FIND (réalisé par l'instruction POS en RPL, j'ai dû subrepticement insérer un DUP avant le REPEAT afin de transmettre la position dans la boucle du WHILE.
Le corolaire, est qu'il ne faut pas oublier le DROP à l'issu de la structure WHILE ... REPEAT ... END afin de faire disparaitre cette valeur.
dprtl a écrit : ↑11 mai 2021 23:41[...]On doit pouvoir améliorer sans trop forcer
C'est ce que j'ai fait, j'ai sans trop me forcer à améliorer ton code BASIC. Pour éviter les tests, j'ai utilisé une vieille astuce qui consiste à ajouter des espaces en début de chaine de caractère; ainsi, on peut supprimer plus facilement un nombre déterminé de caractères d'une chaine sans avoir à vérifier qu'elle est assez longue.
A la ligne 20: de mon code, j'utilise LEFT$( " "+RE$, LEN RE$ ) qui ne crée pas de souci (même si RE$ est trop court) et donne le même résultat que LEFT$( RE$, LEN RE$ - 2 ) qui plante lorsque RE$ fait moins de deux caractères.
Le corolaire de cette astuce est qu'il faut utiliser VAL RE$ pour afficher la valeur zéro lorsque RE$ ne contient plus de chiffre.
Schraf a écrit : ↑12 mai 2021 15:44
- L'idée est de mettre en second paramètre "z" le nombre de zéros que l'on a en réserve.
- "z" augmente de 1 si l'unité "r" est nulle
- Sinon, si l'unité n'est pas nulle mais qu'il reste des zéros, "z" diminue de 1 et on supprime l'unité ( n // 10)
- Et finalement, si on n'a pas de zéros en réserve et que l'unité n'est pas nulle, on garde l'unité et on continue avec n // 10
L'idée du paramètre "z" est celle que j'ai utilisée dans le code pour HP-41C, le registre R00: contient le nombre de "zéro en réserve" c'est à dire le nombre de délétions qu'il reste encore à réaliser. Sur cette machine, je n'ai pas cherché à utiliser la récurrence, par contre, R00: contient en réalité la valeur "1+z" de façon à utiliser les propriété de l'instruction DSE plus judicieusement.
L'enchainement des instructions de test et d'incrémentation ou décrémentation de la séquence ... X<>L x=0? ISG 00 DSE 00 GTO 01 ST+ Z ... est un exemple assez typique d'une astuce pour MPO. Ce code n'est compréhensible que par les autistes qui métrisent parfaitement les règles des sauts de pas de programme des instructions de tests du RPN !! On comprend alors pourquoi R00: est initialisé à 1 et pas à zéro.
Une bonne explication de l'enchainement des instructions conditionnelles est donnée dans ta dernière
vidéo sur l'HP-41C !
Bon, il avec mon code, vous avez une idée de ce qui se passe en enchaînant plus detrois tests !
Danny a écrit : ↑12 mai 2021 16:36Maintenant il faudrait le faire sur des machines qui ne manipulent que des nombres
J'attends avec impatience les versions pour HP-15C, HP-19C et autre HP-65, HP-97 !!
Je prépare une version BASIC pour SHARP PC-1211 qui ressemble fortement à celle de
Schraf pour CANON X-07, mais en Misant Plus Optimisé !
Code : Tout sélectionner
1:CLEAR :INPUT N:P=1
2:Q=.1N,N=INT Q,Z=Z+2*(Q=N:IF Z=0 LET P=10P,R=R+P*(Q-N
3:Z=Z-SGN Z:IF NGOTO 2
4:PRINT R
(Et oui, je suis 100 gênes)
babaorhum a écrit : ↑13 mai 2021 20:33Je propose une solution pour HP-71B, qui manipule les chaînes comme des tableaux ; on ne le dira jamais assez , c'est super pratique !
J'étais justement en train de préparer une version pour HP-71B, mais avec le module ROM JPC, j'utilise une boucle LOOP @ ... @ END LOOP :
Code : Tout sélectionner
10 INPUT N$ @ LOOP @ P=POS(N$,"0") @ IF P THEN N$[P-1,P]="" ELSE LEAVE
12 END LOOP @ DISP VAL(N$&".0") @ END
Le VAL et l'ajout ".0" est une astuce pour que 90000 affiche effectivement 0 et non pas une ligne vide !
Si on a pas de module JPC ROM, on peut facilement adapter :
Code : Tout sélectionner
1 INPUT N$
5 P=POS(N$,"0") @ IF P THEN N$[P-1,P]="" @ GOTO 5 ELSE DISP VAL(N$&".0")
C'est presque plus court, mais il y a un GOTO ! Beurk !!