Misez p'tit Optimisez n°104 : réduction de radicaux imbriqués

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

Répondre
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

Misez p'tit Optimisez n°104 : réduction de radicaux imbriqués

Message par C.Ret »

Le sujet de ce délicieux MPO est fort simple et il ne posera je pense aucun souci aux participants qui , je l'espère, seront nombreux.

Image

SUJET:

Ecrire le plus court programme qui permette la réduction suivante lorsque celle-ci est possible :

Image

Les paramètres a, b et c sont trois nombres entiers positifs, négatifs ou nuls.
Les trois paramètres a,b et c seront saisis en début ou au cours de l'exécution du code. Chaque paramètre ne peut être saisi par l'utilisateur qu'une seule fois. Ce sont des entiers signés, il n'est pas nécessaire de vérifier ou contrôler la saisie de l'utilisateur. L'ordre de la saisie peut être quelconque, l'auteur du code indiquera dans quel ordre celle-ci doit se faire.

Le signe ± interne est donné par le signe du paramètre b .
Ainsi, la saisie des expressions √(a+b√c) et √(a-b√c) ne diffère que par le signe du paramètre b :
Pour l'expression √(a+b√c) , le paramètre b est saisi sans signe (c'est à dire que b est positif) et le résultat sous-entendu sera √X+√Y.
Pour l'expression √(a-b√c) , le paramètre b est saisi avec un signe - (c'est à dire que b est négatif) et le résultat sous-entendu sera √X-√Y.

Les résultats X et Y sont deux nombres entiers non nécessairement positifs ou non-nuls.
Une valeur X ou Y négative indique donc une réduction possible bien que le résultat ait une valeur complexe.

Dans le cas où une réduction est possible, les valeurs de X et Y entières devront être affichées.
A défaut d'un affichage multiple, les deux résultats devront être facilement visibles par l'utilisateur à la fin du calcul, c'est à dire que le second devra être visible en utilisant qu'une seule touche (ex: touche R/S ou X↔Y ou ENTER ou EXE ou MR ou autre).

Si la réduction n'est pas possible, cela devra être indiqué par la machine.
Aucune méthode d'indication n'est imposée, l'auteur du code pourra utiliser tout moyen qu'il jugera convenable et approprié à son code et aux caractéristiques de sa calculette.
Comme par exemple un format d'affichage, un code spécifique, un arrêt sur une erreur, un clignotement d'affichage, un indicateur de drapeau, etc... tous moyens indiquant que la réduction n'est pas possible peuvent être utilisés.
Evidemment, l'auteur du code précisera le moyen utilisé.

Par ailleurs, dans certains cas, l'un des résultats ou les deux peuvent être des carrés parfaits X=x² (ou Y=y²) dans ce cas, même si les caractéristiques d'affichage de la calculette le rende possible, il n'est pas souhaitable de simplifier l'expression du résultat. L'idée étant d'obtenir le code le plus court et des résultats plus facilement comparables avec les calculettes les plus anciennes ou les plus les rudimentaires.

CONSIGNE:
N'oubliez pas Miser Petit, Optimiser !


EXEMPLES:
Je donne ci-dessous quelques exemples de réductions possibles :
Image

CONTRE-EXEMPLES:
Je donne ci-dessous quelques exemples de réductions impossibles :
Image
Modifié en dernier par C.Ret le 06 nov. 2021 18:07, 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
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°104 : réduction de radicaux imbriqués

Message par C.Ret »

J'oubliais de poster l'anti-sèche :
mpo104 plan A.png
mpo104 plan A.png (38.78 Kio) Vu 4142 fois
Ce n'est qu'une façon de faire. Je compte sur vous pour en trouver d'autres.
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
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°104 : réduction de radicaux imbriqués

Message par C.Ret »

Bon, il y a ceux pour qui ce MPO ne sert à rien avec leurs systèmes qui fait déjà tout ça !
MPO104 - TI92II.gif
MPO104 - TI92II.gif (1.74 Kio) Vu 4142 fois
MPO104 - HP Prime.png
MPO104 - HP Prime.png (11.03 Kio) Vu 4142 fois
MPO104 - SHARP PC1360.gif
MPO104 - SHARP PC1360.gif (73.78 Kio) Vu 4142 fois
MPO104 - CASIO fx-890p.png
MPO104 - CASIO fx-890p.png (91.39 Kio) Vu 4065 fois
Quoi qu'en y regardant de plus près, ce n'est pas exactement ce qui est demandé.

Et surtout, il y a tous les autres...
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 : 2919
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Misez p'tit Optimisez n°104 : réduction de radicaux imbriqués

Message par zpalm »

Je vois qu'il n'y a pas foule qui se presse pour ce MPO. Je n'ai pas moi même beaucoup de temps de cerveau disponible en ce moment.
J'ai juste implémenté l'algorithme donné en anti-sèche ci-dessus pour la 42S en n’utilisant que la pile mais sans vraiment chercher à l'optimiser:

Code : Tout sélectionner

00 { 101-Byte Prgm }
01▸LBL "MPO104"
02 X<>Y
03 CF 00
04 X<0?
05 SF 00
06 ABS
07 RCL ST Y
08 X<0?
09 GTO 05
10 SQRT
11 FP
12 X=0?
13 GTO 01
@       C carré parfait : NON
14▸LBL 05
15 CLX
16 RCL ST T
17 STO× ST T
18 R↓
19 X^2
20 ×
21 -
22 X<0?
23 GTO 03
24 SQRT
25 FP
26 X≠0?
27 GTO 03
@       R carré parfait : OUI
28 X<> ST L
29 STO+ ST Z
30 -
31 2
32 ÷
33 X<>Y
34 LASTX
35 ÷
36 GTO 04
@       Erreur: NaN
37▸LBL 03
38 "NaN"
39 AVIEW
40 RTN
@       C carré parfait : OUI
41▸LBL 01
42 R↓
43 X<>Y
44 SQRT
45 ×
46 +
@      X Entier?
47▸LBL 04
48 FP
49 X≠0?
50 GTO 03
51 X<> ST L
@      Pretty Print display (42S)
52 "√"
53 AIP
54 FC? 00
55 ├"+"
56 FS?C 00
57 ├"-"
58 ├"√"
59 X<>Y
60 AIP
61 X<>Y
62 AVIEW
63 END
On entre les 3 valeurs dans la pile puis on lance le programme: A Enter B Enter C XEQ MPO104
Il retourne X et Y dans les registres x et y et affiche la somme des racines dans le registre Alpha, ou NaN si ce n'est pas possible.

Tous les cas de test listés ci-dessus fonctionnent correctement.
Voici le résultat pour Image

Image

L'affichage du résultat dans le registre Alpha (pas 52 à 62) n'est pas indispensable au programme mais c'est quand même bien plus agréable. D’ailleurs si on enlève les pas 52 à 62 le programme doit fonctionner sur une 41C mais je n'ai pas testé.
Modifié en dernier par zpalm le 06 nov. 2021 07:44, modifié 1 fois.
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°104 : réduction de radicaux imbriqués

Message par C.Ret »

zpalm a écrit : 05 nov. 2021 18:39 Je n'ai pas moi même beaucoup de temps de cerveau disponible en ce moment.
Ce n'est pas grave, les MPO sont intemporels, il nous arrive souvent de revenir dessus plusieurs années après les premiers posts. Alors rien d'urgent, ce n'est pas une course, bien au contraire. La seule difficulté que je rencontre est de ne pas trop publier de solutions pour ne pas influencer le travail des éventuels candidats et laisser libre cours à l'imagination de chacun.

En tout cas merci de démarrer ce M.P.O. et de proposer une première solution :)


Je vais étudier de près ce code et voir s'il va me donner quelques idées pour améliorer le code que je prépare pour HP-41C.
Ca va être long, je débute(sur le tard) l'apprentissage de la programmation synthétique qui va peut-être nous servir ici pour améliorer l'affichage. Je vois sur la capture que l'HP-42S sait afficher convenablement '√' .
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
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°104 : réduction de radicaux imbriqués

Message par C.Ret »

Je suis en plein apprentissage. Je vais tenter une première, proposer un code synthétique sur l'HP-41C. Mais c'est pas gagné.


Pour l'instant, je peaufine mes connaissances et fait quelques tests. La programmation synthétique devrait me permettre de réduire la taille du code en autorisant quelques raccourcis calculatoires et surtout trouver un moyen d'imprimer (ou d'afficher - mais c'est pas encore ça hein !) le symbole racine carrée comme sur l' HP-42S.

En attendant, j'étudie (notamment dans HP41 SYNTHETIC PROGRAMMING MADE EASY de Keith Jarett (Copyright 1982, SYNTHETIX - P.O. Box 1080 - Berkeley, CA 94701-1080 - U.S.A. - Library of Congress Card Catalog Number: 82-62786 -ISBN: 0-9612174-0-5)

Une petite capture de la page 2 pour donner un petit aperçu de ce que peut apporter ce type de synthèse :
MPO104 - Synthetic HP-41C.png
MPO104 - Synthetic HP-41C.png (18.85 Kio) Vu 3293 fois
Semble prometteur pour du MPO tout ça !!
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 : 2919
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Misez p'tit Optimisez n°104 : réduction de radicaux imbriqués

Message par zpalm »

C.Ret a écrit : 09 déc. 2021 18:18 La programmation synthétique devrait me permettre de réduire la taille du code en autorisant quelques raccourcis calculatoires et surtout trouver un moyen d'imprimer (ou d'afficher - mais c'est pas encore ça hein !) le symbole racine carrée comme sur l' HP-42S.
Je crains que l’affichage sur une 41 du symbole racine carrée soit compliqué car il ne figure pas dans la table des caractères des modèles halfnut qui peuvent pourtant afficher plus de caractères que les fullnut:
Image

Pour l’impression sur une imprimante IR 82240A/B il ne devrait pas y avoir de problème, par contre sur une 82143A ou une 82162A ça risque d’être plus sportif car ces deux imprimantes ont un jeu de caractères limité sans le symbole de la racine carrée et il faudra construire le caractère à la main.
C.Ret a écrit : 09 déc. 2021 18:18 En attendant, j'étudie (notamment dans HP41 SYNTHETIC PROGRAMMING MADE EASY de Keith Jarett)
Ce livre est aussi disponible en version française.
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°104 : réduction de radicaux imbriqués

Message par C.Ret »

zpalm a écrit : 10 déc. 2021 00:10Pour l’impression sur une imprimante IR 82240A/B il ne devrait pas y avoir de problème
Effectivement le code caractère pour la racine carrée est disponible dans les deux mapping (MAPOFF et MAPON) des IR 82240A/B et c'est donc très facile d'imprimer le caractère qui correspond au code 131.

On peut donc imprimer √3+√2 depuis son HP-51C par une séquence d'instruction du style

Code : Tout sélectionner

[ADV] 131 [ACCHR] 51 [ACCHR] 43 [ACCHR] 131 [ACCHR] 50 [ACCHR] [ADV]
.

Là la programmation synthétique peut être utilisée pour optimiser le code avec quelque chose de moins crypté et plus court "√3+√2" ACA ADV en permettant de créer dans le programme une chaine de caractères contenant le code 131 qui sera vu par l'imprimante IR comme le symbole
zpalm a écrit : 10 déc. 2021 00:10par contre sur une 82143A ou une 82162A ça risque d’être plus sportif car ces deux imprimantes ont un jeu de caractères limité sans le symbole de la racine carrée et il faudra construire le caractère à la main.
Effectivement, la construction du symbole 'racine carrée' va devoir se faire explicitement :

Code : Tout sélectionner

 1 □ □ □ ■ ■ ■ □           0 [ENTER^]
 2 □ □ □ ■ □ □ □           0 [BLDSPEC] 16 [BLDSPEC] 32 [BLDSPEC] 127 [BLDSPEC]
 4 □ □ □ ■ □ □ □           1 [BLDSPEC] 1 [BLDSPEC] 0 [BLDSPEC]  [STO[01]]
 8 □ □ □ ■ □ □ □
16 □ ■ □ ■ □ □ □            
32 □ □ ■ ■ □ □ □
64 □ □ □ ■ □ □ □

   0 1 3 1 1 1 0           [ADV] [RCL[01]] [ACSPEC] 51 [ACCHR] 43 [ACCHR] [RCL[01]] [ACSPEC] 50 [ACCHR] [ADV]
     6 2 2
         7
La première partie des opérations mémorise le nouveau caractère dans le registre 01. La seconde imprime la même expression que précédemment.
Tout ça est assez facile à faire avec les manuels sous les yeux, en mode USER en ayant préparé convenablement un 'overlay' dédié. Car trop de fonctions utilisateur tue l'utilisateur.


Concernant l'affichage du symbole racine carrée sur l'écran LCD en 14 segments de l'HP-41C, j'ai laissé tombé car effectivement il n'y a pas de symbole approprié.

Je vais donc continuer à utiliser le symbole R comme indicateur de la Racine carrée ce sera plus simple et plus lisible. Même si ce n'est pas indispensable dans ce MPO, on sait que les deux résultats sont les arguments des deux racines. Comme cela j'économise encore plus de code.
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.
Répondre

Retourner vers « Tous les Pockets »