MPO 109 - UNION et INTERSECTION

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
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 498
Enregistré le : 05 mars 2020 20:45
Contact :

Re: MPO 109 - UNION et INTERSECTION

Message par Schraf »

@C.Ret Je comprends pourquoi tu as utilisé sub dans ton programme, c'est que toString n'existe que sur les Ti-84 Silver CE et les TI-83 Premium, pas sur les anciennes Ti-83, 83+ ou 84+...

Version pour les Ti-83/84 :

Code : Tout sélectionner

Input Str1
Input Str2
".I=→Str4
For(I,1,9
toString(I→Str3		@ sub("123456789",I,1→Str3 sur les anciennes machines
inString(Str1,Str3→A
inString(Str2,Str3→B
If A and B
Str4+Str3→Str4
If A or B
Str3+Str4→Str4
End
If "."=sub(Str4,1,1
"0"+Str4→Str4
If "="=sub(Str4,length(Str4),1
Str4+"0"→Str4
Disp "U="+Str4
Exemples :

123 et 345 donnent U=54321.I=3
0 et 0 donnent U=0.I=0
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: MPO 109 - UNION et INTERSECTION

Message par C.Ret »

zpalm a écrit : 18 mai 2022 23:50 Sur la HP Prime pas besoin de programme, on peut écrire des "one liners" pour définir des fonctions utilisateur.

Pour l’union en 54 caractères :
[[...]]
Je regarde aussi pour une solution en RPN, c’est un poil plus compliqué…
Merci zpalm pour cette version.
J'ai passé la fin de ma soirée de mardi à chercher en vain comment transformer efficacement un nombre en une liste contenant ses chiffres. Je me souvenais très bien qu'une des dernières mises à jour avait apporté les très utiles instructions UNION, INTERSECTION et DIFFERENCE, mais je ne me rappelais plus qu'elles ne fonctionnent que sur des listes...

Ah! C'est très exactement les one-liner que je cherchais à écrire ! Merci, me voilà soulagé d'un poids (même si je rage de ne pas avoir été le premier à publier ici cette astuce !)

Par contre, je suis content, j'ai su améliorer considérablement mon code pour SHARP PC-1211. Utiliser des chaines alphanumériques sur cette machine n'était pas une bonne idée ! Une version entièrement numérique et algébrique me permet de résoudre Intersection et Union six fois plus vite et avec un code trois fois plus court !

Je vous mets ci-dessous une capture des résultats obtenu avec cette nouvelle version :
Voyez-vous comme cette nouvelle version est vachement mieux ?
Voyez-vous comme cette nouvelle version est vachement mieux ?
MPO109 SHARP PC-1211 preview U and I using direct numeric algorithm.gif (45.46 Kio) Vu 2676 fois
Spectaculaire n'est-ce pas ?

En tout cette méthode va me permettre d'optimiser considérablement mes code pour Ti58C, HP-15C et TI-57 LCD ou HP-41X, hé hé hé ...
Modifié en dernier par C.Ret le 24 juin 2022 20:45, 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
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2917
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: MPO 109 - UNION et INTERSECTION

Message par zpalm »

C.Ret a écrit : 19 mai 2022 18:30 Spectaculaire n'est-ce pas ?

En tout cette méthode va me permettre d'optimiser considérablement mes code pour Ti58C, HP-15C et TI-57 LCD ou HP-41X, héhéhé...
Je suis impatient de voir le résultat !

En attendant voici un programme en 67 pas (118 octets) et deux registres (R00, R01) pour HP 41CX ou HP 41C/CV + module de fonctions étendues. Il fonctionne aussi sur une 42.
On entre les deux nombres dans la pile puis on lance MPO109, il retourne l’union des deux nombres dans X et l’intersection dans Y. Les résultats sont ordonnés.

Par exemple sur HP-41: 1142 [ENTER] 312 [XEQ] [Alpha]MPO109[Alpha] retourne 1234 puis [X<>Y] donne 12

Code : Tout sélectionner

00 { 118-Byte Prgm }
01▸LBL "MPO109"
02 STO 00
03 X<>Y
04 STO 01
05 XEQ 00
06 X<> 01
07 ENTER
08 XEQ 00
09 CLA
10 ARCL 00
11 ENTER
12 LOG
13 IP
14 10^X
15 ÷
16 0
17 X<>Y
18▸LBL 01
19 FP
20 LASTX
21 IP
22 48
23 +
24 POSA
25 X<0?
26 GTO 02
27 R↓
28 10
29 STO× ST Z
30 X<> ST L
31 48
32 -
33 STO+ ST Z
34▸LBL 02
35 R↓
36 10
37 ×
38 X≠0?
39 GTO 01
40 X<> 01
41 RTN
42▸LBL 00
43 FIX 00
44 CF 29
45 CLA
46 ARCL ST X
47 ARCL ST Y
48 1.009
49 0
50▸LBL 03
51 RCL ST Y
52 48
53 +
54 POSA
55 X<0?
56 GTO 04
57 R↓
58 10
59 ×
60 RCL ST Y
61 IP
62 STO+ ST Y
63▸LBL 04
64 R↓
65 ISG ST Y
66 GTO 03
67 END
Le sous programme qui calcule l'union des deux nombres en X et Y se trouve à partir du pas 042 (label 00). Il retourne un résultat ordonné.
La partie du programme qui calcule l'intersection des deux nombres se trouve à partir du pas 006, elle commence par appeler 'union' avec un des deux nombres de départ ce qui retourne les digits ordonnés de ce nombre sans doubles (par exemple pour 1142 on obtient 124). Puis elle regarde lesquels de ces digits se trouvent aussi dans l'autre nombre.

Voici aussi le .raw pour celles/ceux qui veulent tester sur un émulateur ou une DM41X/42 sans avoir a le ressaisir: MPO109.raw

Note: ce programme change le format d'affichage en FIX 0 avec le point comme séparateur décimal.

EDIT: en fait en regardant les résultats de C.Ret ci-dessus, je me suis aperçu que les pas 43 et 44 (FIX 00 CF 29) de mon programme sont inutiles, on peut les supprimer et passer à 65 pas et 114 octets, tout en ajoutant le support des nombres avec des décimales !!!
Modifié en dernier par zpalm le 19 mai 2022 20:38, modifié 2 fois.
FLISZT
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 655
Enregistré le : 09 mars 2022 19:14

Re: MPO 109 - UNION et INTERSECTION

Message par FLISZT »

@ Schraf

Code : Tout sélectionner

« DUP2 POS ::; ::+ IFTE »
est équivalent à

Code : Tout sélectionner

« DUP2 POS { ; } { + } IFTE »
Avec des { } mon programme pèse 68 octets au lieu de 65.
Ce truc, dit des "tags vides", fonctionne en principe (aussi) sur 48s / 48sx, les premières calculatrices à avoir été dotées de la fonction TAG.

Si je me souviens bien, ce truc ne fonctionne pas avec une séquence de plusieurs instructions, laquelle devra donc être mise entre accolades, mais :

Code : Tout sélectionner

« DUP2 POS ::; { + } IFTE » 	@ est correct / mélange de :: et de {} dans une structure IFTE

Remarques (valables au moins sur hp-50g) :

− On a saisit, par exemple, sans espace entre les :: et ce qui suit :

Code : Tout sélectionner

« ::+ »
Mais lorsque le programme est sur la pile, voici ce que l'on peut lire :

Code : Tout sélectionner

« : + »
… càd ⇒ « : espace + ».

− En revanche, en mode éditeur, on peut lire :

Code : Tout sélectionner

:: +
… avec, cette fois, un espace entre les :: et ce qui suit.

− Sur hp-50g toujours (je n'ai ni 48 ni 49), mieux vaut être en mode alphabétique lors de la saisie de cette séquence particulière. J'ai même l'impression que l'on n'a pas trop le choix si l'on veut avoir une saisie correcte (sans espace). :)

Edit : qq précisions supplémentaires.
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 : 3400
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: MPO 109 - UNION et INTERSECTION

Message par C.Ret »

zpalm a écrit : 19 mai 2022 20:05
C.Ret a écrit : 19 mai 2022 18:30 Spectaculaire n'est-ce pas ?

En tout cette méthode va me permettre d'optimiser considérablement mes code pour Ti58C, HP-15C et TI-57 LCD ou HP-41X, héhéhé...
Je suis impatient de voir le résultat !
Une première version utilisant la dernière mouture de ce dernier algorithme, tient en 57 pas (et 88 bytes - sans le LBL "MPO109 et le END final), utilise les registres de R00 à R09, la pile mais ni le registre L, ni le registre Alpha. Il n'a besoin d'aucun module, ni extension mémoire, il tourne parfaitement sur une HP-41C de base.

Par commodité, il utilise les labels locaux A et E :
A - Permet de saisir une nouvelle paire de nombres : en mode user, pressez A puis à l'invite 1. saisir le premier nombre puis continuer en pressant R/S. Saisir le second nombre lors de l'invite 2. et pressez sur R/S pour avoir les résultats.
E - Place l'UNION et l'INTERSECTION respectivement dans les registres X: et Y:. On peut répéter E à volonté afin de replacer les résultats dans X et Y.

Ainsi pour effectuer l'exemple donné par zpalm, activer le programme (si celui-ci n'est pas le seul en mémoire) :
En mode USER pressez sur [ A ].
Le mode d'affichage FIX 0 n'est pas indispensable, l'utilisateur peut le changer à loisir.
La HP-41C affiche 1.0000, saisir alors le premier nombre : 1142 puis continuer en pressant [R/S]
Quelques oies passent de gauche à droite puis 2.0000 s'affiche invitant l'utilisateur à saisir le second nombre: 312 et valider en pressant [R/S]
Encore quelques petites secondes d'oiseaux migrateurs volant vers l'Est puis on obtient l'affichage de l'UNION:
Une pression sur [X<>Y] permet d'avoir l'INTERSECTION:
MPO109 HP-41C preview U and I without Alpha.png
MPO109 HP-41C preview U and I without Alpha.png (52.26 Kio) Vu 2622 fois
L'utilisateur attentif remarquera qu'avec cet exemple ne contenant pas de chiffre supérieur à 4, l'INTERSECTION est à peu près visible dès l'affichage de l'UNION. Ce petit indice dévoile une partie de la stratégie utilisée. héhé
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 : 498
Enregistré le : 05 mars 2020 20:45
Contact :

Re: MPO 109 - UNION et INTERSECTION

Message par Schraf »

@C.Ret J'imagine que tu utilises les FLAGS du HP-41 pour mémoriser les infos, pour ma part je n'arrive même pas à faire tenir la recherche de l'UNION de 2 nombres sur la Ti-57 🥵.

Entre mémoriser les 2 nombres (STO 0 et 1), avoir une variable (STO 2) qui parcourt les chiffres de 1 à 9, la mémoire n°7 pour les tests, les tests qui serviront à faire un AND et OR ("RCL 2 est dans RCL 0 ?" ET/OU "RCL 2 est dans RCL 1 ?") à mettre dans une ou 2 mémoires, mémoriser les résultats UNION et INTERSECTION et que ça tienne en 50 pas... Je ne suis pas certain d'y arriver même en utilisant plusieurs sous-programmes afin d'optimiser le code.
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: MPO 109 - UNION et INTERSECTION

Message par C.Ret »

Oui, effectivement, tous les codes que j'ai générés pour le moment sont basés sur le même principe. les nombres donnés en arguments sont décomposés chiffre par chiffre viennent renseigner un vecteur de registres dont le contenu numérique sera utilisé pour produire UNION et INTERSECTION. Typiquement et pour simplifier le code j'utilise les registres R0, R1 jusqu'à R9 et surtout les capacités d'adressage indirecte de la machine.

Sur les calculatrices HP-41 et Ti-58c il y a de plus suffisamment de drapeaux pour simplifier le codage numérique dans les registres en levant ou baissant très facilement les drapeaux entre Flg0 et Flg9.

Mais, je perfectionne le codage, j'ai même fait une version monstrueuse sur HP-41C qui n'utilise pas les drapeaux en généralisant l'usage du codage dans un vecteur de registre. Cette version, hors norme, répond au cahier des charges de ce m.p.o. mais permet un nombre infini d'arguments. En plus de l'UNION et de l'INTERSECTION, la DIFFERENCE est aussi calculée.

Je donne ci-dessous une illustration avec trois arguments : A= 15417 , B=2247582 et C=58375.
On obtient:
[A]: INPUT [B]:UNION [C]: INTER [D]: DIFF [E]:CLEAR
[A]: INPUT [B]:UNION [C]: INTER [D]: DIFF [E]:CLEAR
MPO109 HP-41C Multi arguments specific U I and D (3 samples).gif (24.61 Kio) Vu 2586 fois
Quand aux machines n'ayant pas assez de ressources pour mémoriser traiter un vecteur de registration, j'envisage un algorithme plus lent basé sur des itérations; Cela fonctionne déjà sur le SHARP PC-1211 mais est bien lent.

Pour le moment, je n'avais envisagé que la Ti-57 LCD, mais un peu découragé par son manque de ressource, je n'ai pas encore commencé à coder. A priori, il y aurait à modifier deux ou trois pas de programme entre deux utilisations pour que cela fonctionne. Ou alors effectivement, il y aura bien un programme différent pour UNON, INTERSECTION ou DIFFERENCE...

.. peut-être que ça marcherai sur une Ti-57 nettement plus puissante ???
Modifié en dernier par C.Ret le 24 juin 2022 20:51, 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 : 498
Enregistré le : 05 mars 2020 20:45
Contact :

Re: MPO 109 - UNION et INTERSECTION

Message par Schraf »

Version pour les CASIO fx-6800G (1995 - 400 octets), fx-7800G (1992 - 4164 octets) etc.

Le programme fait 125 octets :

Code : Tout sélectionner

MODE WRT
Prog 0
?→A:?→B:0→I˜J:9→K:Lbl 1:A:Prog 1:R→C:B:Prog 1:R+C>0⇒10J+K→J:RC>0⇒10I+K→I:Dsz K:Goto 1:J◢I◢

Prog 1
Ans→V:0→R:Lbl 1:V÷10→V:Frac V=K÷10⇒Goto 2:Int V→V:V≠0⇒Goto 1:Goto 3:Lbl 2:1→R:Lbl 3

MODE RUN
Prog 0
? 123226
? 566633
65321 EXE
63
Démonstration en vidéo sur 2 CASIO graphiques

- Les 2 nombres initiaux sont mémorisés dans A et B
- La mémoire I contiendra l'intersection et J l'union
- L'idée est de faire parcourir à K les chiffres de 9 à 1
- On appelle 2 fois le sous-programme 1 en mettant en paramètre A puis ensuite B, que l'on récupère dans Prog 1 via Ans. Le sous-programme renvoie R=1 si K est dans le nombre et R=0 sinon.
- Il suffit ensuite de faire un OU (addition R+C) et un ET (multiplication RC) pour mettre ou non à jour les mémoires I et J
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 498
Enregistré le : 05 mars 2020 20:45
Contact :

Re: MPO 109 - UNION et INTERSECTION

Message par Schraf »

Petite variation en un seul programme et testé sur une CASIO fx-7000G (1985, 1ere calculatrice graphique)

Code : Tout sélectionner

Mcl:?→A:?→B:9→J:2→C		@ On efface les mémoires + initialisations
Lbl 1:A[C-1]→V			@ A[0] correspond à la mémoire A, A[1] à la mémoire B etc.
Lbl 2:V÷10→V:Frac V=J÷10⇒Goto 3	@ Si J est dans le nombre aller en 3
Int V→V:V≠0⇒Goto 2:Goto 4	@ Sinon continuer avec les autres chiffres du nombre
Lbl 3:Isz Q[C]			@ Incrémentation de Q[1] (mémoire R) ou Q[2] (mémoire S)
Lbl 4:Dsz C:Goto 1		@ Permet de chercher dans B puis dans A
R+S>0⇒10U+J→U:RS>0⇒10I+J→I	@ Mise à jour union et intersection
2→C:0→R˜S:Dsz J:Goto 1		@ On recherche chiffre J suivant (J allant de 9 à 1)
U◢				@ Affichage de l'union et de l'intersection
I◢
Démonstration en vidéo sur la CASIO fx-7000G
Répondre

Retourner vers « Tous les Pockets »