MPO n°113 - Nombre d'abonné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
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

MPO n°113 - Nombre d'abonnés

Message par Schraf »

Voici le principe d'affichage du nombre d'abonnés de votre réseau social préféré :

Code : Tout sélectionner

Si vous avez…     	l'affichage sera…
--------------------	-----------------
1 abonné		1
123 abonnés		123
1 200 abonnés		1.20 K
1 234 abonnés		1.23 K
12 345 abonnés		12.3 K
123 456 abonnés		123 K
1 200 000 abonnés	1.20 M
1 234 567 abonnés	1.23 M
12 345 678 abonnés	12.3 M
123 456 789 abonnés	123 M
L'affichage a donc au maximum 3 chiffres.

Programme demandé
A partir d'un nombre compris entre 0 et 999 999 999 abonnés, votre calculatrice affichagera sa forme simplifiée.
Pour les machines n'ayant pas de caractères (K, M), vous utiliserez les puissances de 10. Par exemple :

Code : Tout sélectionner

123 donne 123
1 234 donne 1.23 E 03
123 456 donne 123 E 03
1 200 000 donne 1.20 E 06
123 456 789 donne 123 E 06
Sommaire des MPO
Modifié en dernier par Schraf le 23 oct. 2022 10:48, modifié 1 fois.
antoine
Fonctionne à 75 bauds
Fonctionne à 75 bauds
Messages : 14
Enregistré le : 04 août 2022 10:18

Re: MPO n°113 - Nombre d'abonnés

Message par antoine »

Bonjour,

Je vous propose pour PB-100 une solution en 89 pas de calcul :

Code : Tout sélectionner

1 VAC:B$="K":C$="M":INPUT N:H=INT(LOG(N)):P=INT(H/3):F=10^(2-3*FRAC(H/3)):M=INT(N/(10^(3*P))*F)/F:PRINT M;A$(P)
antoine
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: MPO n°113 - Nombre d'abonnés

Message par C.Ret »

@ Antoine,

Bonsoir. Pas mal le code!

Mais je le trouve un peu long. J'ai une astuce qui peut ne faire qu'un octet qui marche bien sur toutes mes calculatrices HP (en réalité toutes les HP depuis l'HP-25) mais un peu moins bien sur d'autres de mes machines:
MPO113 - tab1.gif
MPO113 - tab1.gif (31.65 Kio) Vu 3463 fois
@ Tous,
C'est toute l'astuce de cet MPO. Je reviens avec des codes corrects pour ma Ti, fx-602p et EL-5150.



@ Schraf : 10.8 K félicitations !!
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: MPO n°113 - Nombre d'abonnés

Message par zpalm »

L'astuce de C.Ret est particulièrement concise, malheureusement elle ne répond pas exactement à ce qui est demandé dans l'énoncé.

Voici donc un programme pour 41CX ou 41C/CV avec module X-Functions, certes beaucoup plus long mais qui fournit les réponses exactes aux exemples de l'énoncé.

Code : Tout sélectionner

00 { 83-Byte Prgm }
01▸LBL "MPO113"
02 CLA
03 RCLFLAG
04 STO ST L
05 X<>Y
06 SF 28
07 CF 29
08 100
09 X≤Y?
10 GTO 01
11 FIX 00
12 ARCL ST Y
13 GTO 48
14▸LBL 01
15 ENG 02
16 X<>Y
17 ARCL ST X
18 3
19 AROT
20 R↓
21 46
22 ATOX
23 X≠Y?
24 XTOA
25 ATOX
26 R^
27 ATOX
28 GTO IND ST X
29▸LBL 54
30 ├" M"
31 GTO 48
32▸LBL 51
33 ├" K"
34▸LBL 48
35 X<> ST L
36 STOFLAG
37 R↓
38 AVIEW
39 END
Le registre X et tous les flags sont préservés.
FLISZT
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 655
Enregistré le : 09 mars 2022 19:14

Re: MPO n°113 - Nombre d'abonnés

Message par FLISZT »

Un MPO ! Ça faisait longtemps ! :D
Je vais me coucher un peu plus tard que prévu…

Code : Tout sélectionner

<<
   DUP 
   3 FIX			@ 3 FIX → déplacé au début du programme
   IF 6 ALOG ≥
   THEN 6. ALOG / " M" +
   ELSE
	 DUP 
	 IF 3 ALOG ≥
	 THEN 3. ALOG / " k" +
	 END
   END
   DUP SIZE −> L
      <<
         IF L 5 >
         THEN DUP 1 4 SUB	@ ancienne ligne : THEN 3 FIX DUP 1 4 SUB 
              SWAP
              L 1 − L SUB
              +
         END
      >>
   STD				@ ajout : retour au mode "normal" / standard
>>
172 octets ; 174,5 octets avec STD ajouté en fin de programme

J'ai été obligé de rajouter << 3 FIX >> car sinon avec 1 200 000 le prog renvoyait "1.2 M" au lieu de "1.20 M".
Résultat : + 5 octets !

Si l'on rentre 120000000000 (donc hors limtes), le programme renvoie : "1200. M"

8O …… je viens de découvrir un truc sur hp-50g (pas sur hp-28s) :

si j'entre comme précédemment 120000000000 dans la pile… rien de spécial ;
mais si je rentre 12E10, la machine transforme le nombre en : 120,000,000,000. :!:
Ça vient du 3 FIX du programme de toute évidence et c'est plus lisible.

EDIT : j'ai modifié la position de la commande « 3 FIX » pour des raisons de fonctionnalité du programme.
Le jeu d'essai de Schraf fonctionnait à 100% mais, pris dans le désordre (en partant du mode STD), ce n'était pas forcément le cas : un zéro (ou plus) manquait à l'affichage + coquilles
Modifié en dernier par FLISZT le 02 oct. 2022 03:38, modifié 3 fois.
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: MPO n°113 - Nombre d'abonnés

Message par FLISZT »

Ce formatage du résultat, ça doit pouvoir se faire avec des trucs du genre PRINT USING "##.##" en BASIC, si je me souviens bien… (?)
… pis ça devrait pouvoir aussi se faire en COBOL avec des PIC (mais sans colégrammes).
:D
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
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3626
Enregistré le : 06 sept. 2011 14:57
Localisation : Normandie

Re: MPO n°113 - Nombre d'abonnés

Message par Hobiecat »

Sur la majorité des HP purement numériques ayant le formatage "Engineering", il suffit effectivement de faire ENG 02 et tous les nombres seront présentés comme la fin de l'énoncé, mais c'est un peu de la triche sur les alphanumériques. :wink:
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2919
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: MPO n°113 - Nombre d'abonnés

Message par zpalm »

Hobiecat a écrit : 30 sept. 2022 07:06 Sur la majorité des HP purement numériques ayant le formatage "Engineering", il suffit effectivement de faire ENG 02 et tous les nombres seront présentés comme la fin de l'énoncé,
Sauf les nombres <1000 dont le format est différent de l’énoncé … de plus les nombres comme 123456 sont affichés 123. E03, alors que le point ne devrait pas être affiché si on suit l’énoncé.
Mon petit programme pour HP-41 ci-dessus respecte ces particularités.
Avatar du membre
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3626
Enregistré le : 06 sept. 2011 14:57
Localisation : Normandie

Re: MPO n°113 - Nombre d'abonnés

Message par Hobiecat »

zpalm a écrit : 30 sept. 2022 07:21 Sauf les nombres <1000 dont le format est différent de l’énoncé … de plus les nombres comme 123456 sont affichés 123. E03, alors que le point ne devrait pas être affiché si on suit l’énoncé.
Mon petit programme pour HP-41 ci-dessus respecte ces particularités.
Tu as parfaitement raison, on pourrait continuer la "triche" en testant les nombres inférieurs à 1000 et adaptant le formatage en quelques instructions, mais ça ne résoudrait clairement pas le problème du point en revanche.

Ta solution et celle de FLISZT ci-dessus sont clairement de meilleures réponses au MPO ! :wink:
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: MPO n°113 - Nombre d'abonnés

Message par C.Ret »

antoine a écrit : 29 sept. 2022 12:27Je vous propose pour PB-100 une solution en 89 pas de calcul :
Bon, je trouvais cela un peu long, mais en relisant ce que j'ai fait en BASIC, c'est plutôt très bien. Je vais attendre un peu avant de vous montrer mes lignes, des fois que je trouve une astucieuse idée pour zipper ma version.
zpalm a écrit : 29 sept. 2022 23:23L'astuce de C.Ret est particulièrement concise, malheureusement elle ne répond pas exactement à ce qui est demandé dans l'énoncé.


Et en plus, j'annonce un octet sur HP-41C, mais je viens de vérifier, c'est deux octets sur une HP-41. Ce n'est 1 octet que sur les voyagers et autres classiques.

FLISZT a écrit : 30 sept. 2022 03:10 8O …… je viens de découvrir un truc sur hp-50g (pas sur hp-28s) :


Et oui, un entier long n'est pas formaté, alors qu'un entier ou réel en précision normale est affiché avec le formatage sélectionné !

Mais dit moi, il n'ya a pas de structure SELECT/CASE/.../CASE ELSE sur HP-50g?
Et depuis quand on peut additionner un nombre avec une chaine de caractères?
Ca aussi se sont des choses que l'on ne voient pas sur HP-28C/S

Hobiecat a écrit : 30 sept. 2022 07:06Sur la majorité des HP purement numériques ayant le formatage "Engineering", il suffit effectivement de faire ENG 02 et tous les nombres seront présentés comme la fin de l'énoncé, mais c'est un peu de la triche sur les alphanumériques.
C'est même parfaitement interdit, Schraf a bien précisé que l'on pouvait utiliser la notation exponentielle s'il n'y avait pas de lettre K et M. Or, je crois que ces deux caractères existent sur le clavier et l'écran d'une HP-41C.
Par contre, l'instruction ENG ne prend qu'un seul chiffre comme argument (ENG 2). Ce n'est pas tout à fait exact, il peut y avoir d'autres types d'arguments; cela me donne une idée... héhé hé :)
zpalm a écrit : 30 sept. 2022 07:21 … de plus les nombres comme 123456 sont affichés 123. E03, alors que le point ne devrait pas être affiché si on suit l’énoncé.
Oui effectivement, je vous trouve tous d'ailleurs bien pointilleux ce soir chers confrères. Je vais donc devoir faire mieux pour l'HP-41C. Un point c'est tout!
Hobiecat a écrit : 30 sept. 2022 09:22Ta solution et celle de FLISZT ci-dessus sont clairement de meilleures réponses au MPO !
Pour le moment, car tout le monde n'a pas encore joué...

C.Ret a écrit : 29 sept. 2022 20:17@ Tous,
C'est toute l'astuce de cet MPO. Je reviens avec des codes corrects pour ma Ti, fx-602p et EL-5150.
Concernant la SHARP EL-5150, la partie est finie, on ne peut pas programmer les instructions de formatage numérique FSE ou TAB n dans les expressions algébriques ni afficher de caractères alphanumérique à droite d'un résultat.
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.
FLISZT
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 655
Enregistré le : 09 mars 2022 19:14

Re: MPO n°113 - Nombre d'abonnés

Message par FLISZT »

Bonjour,

Voici une "nouvelle" mouture de mon programme précédent… en fait deux structures IFT(E) imbriquées.
C'est peut-être moins lisible (?) mais c'est ±10% plus léger ! :wink:

Code : Tout sélectionner

<<
	DUP 
	3 FIX
	6 ALOG ≥ 
	   { 6. ALOG / " M" + } 	
	   { DUP 
	     3 ALOG ≥ 
	        {3. ALOG / " k" + } IFT } IFTE
	DUP
	SIZE → L
	<<	
	   L 5 >
	      { DUP 
	        1 4 SUB SWAP 
	        L 1 − L SUB + } IFT
	>>
	STD
>>

154,5 octets ; 157 octets avec STD à la fin.

J'ai peut-être une autre "vraie" idée de programme (différent)… à voir.
Modifié en dernier par FLISZT le 02 oct. 2022 03:41, modifié 1 fois.
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: MPO n°113 - Nombre d'abonnés

Message par FLISZT »

C.Ret a écrit : 30 sept. 2022 18:58
Et depuis quand on peut additionner un nombre avec une chaine de caractères?
Ca aussi se sont des choses que l'on ne voient pas sur HP-28C/S
Que veux-tu C.Ret, « Rome n'est plus dans Rome… » ! :D

Plus sérieusement, je parlerai plutôt de concaténation d'objets que d'addition.

Le RPL n'est pas spécialement un langage typé tout comme bien d'autres.
En UNIX, si mes souvenirs sont bons, on peut écrire des scripts permettant ce genre de "transgression". :wink: LOL

En tout cas, il y a encore dans mon PC un script "Linux" que j'avais écrit pour "débloquer" des fichiers PDF, script qui utilise la possibilité "d'associer"
(et même d'insérer) un nombre à (dans) du texte. D'accord, il n'y a pas de " + " dans mon exemple…

Code : Tout sélectionner

#!/bin/bash

for i in `seq 10 15` 
  do
    gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile="MS0"$i".pdf" -c .setpdfwrite -f "Micro-Systemes-0"$i"-old.pdf"
  done
Pour revenir plus précisément au RPL et à ta question, je n'en connais pas la réponse.
J'aurais tendance à miser sur la génération des hp-48g/gx/g+.

Le plus sûr est de demander aux membres du forum qui possèdent une hp-48s/sx et / ou une hp-48g/gx/g+ de lancer un programme du genre

Code : Tout sélectionner

<< 5 "ABC" + >>
et d'attendre leurs réponses.

La hp-28s ne permet pas cela, c'est clair… Was ROM(e) already way too full?

Si l'on veut à tout prix éviter cet "inopportun" signe plus, la solution pourrait être d'utiliser les unités (→UNIT) et les préfixes (k, M, G…).
J'ai essayé, mais dans le cadre d'un MPO c'est plutôt lourd et j'ai eu un problème avec la valeur 1200 et plus encore avec 12000 / 120000 / etc.
Partie remise ?

C.Ret a écrit : 30 sept. 2022 18:58 Mais dit moi, il n'ya a pas de structure SELECT/CASE/.../CASE ELSE sur HP-50g?
Pour ce qui est de la structure CASE, elle existe depuis les hp-48s/sx… c'est (te) dire.
Mais est-elle utile quand on a seulement deux IF imbriqués, et efficace quand on cherche à "miser petit" ?
Pas sûr, mais j'essayerai, et peut-être dès ce soir, ne serait-ce qu'à titre d'exercice.

Schraf n'est pas encore intervenu, C.Ret à peine… ils nous mijotent des trucs, c'est sûr ! 8O
:lol:
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
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2919
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: MPO n°113 - Nombre d'abonnés

Message par zpalm »

FLISZT a écrit : 01 oct. 2022 20:44 Le plus sûr est de demander aux membres du forum qui possèdent une hp-48s/sx et / ou une hp-48g/gx/g+ de lancer un programme du genre

Code : Tout sélectionner

<< 5 "ABC" + >>
et d'attendre leurs réponses.
Sur 48SX et 48GX on obtient "5ABC".
Sur 28S on a un message d’erreur: Bad Argument Type.
Modifié en dernier par zpalm le 02 oct. 2022 15:56, modifié 2 fois.
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2919
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: MPO n°113 - Nombre d'abonnés

Message par zpalm »

Une version pour HP Prime:

Code : Tout sélectionner

EXPORT MPO113(N)
BEGIN
LOCAL f:=HFormat,d:=HDigits,n,s;
 IF N<1000 THEN
  HFormat:=0;s:=STRING(N); //standard mode
 ELSE
  HFormat:=3;HDigits:=2;   //engineering 2 mode
  n:=DIM(s:=STRING(N));
  s:=s(1,n-2)+IFTE(s(n)==51," K"," M");
 END;
 HFormat:=f;HDigits:=d;    //restore display mode
 PRINT(s);
END;
FLISZT
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 655
Enregistré le : 09 mars 2022 19:14

Re: MPO n°113 - Nombre d'abonnés

Message par FLISZT »

zpalm a écrit : 02 oct. 2022 15:43
FLISZT a écrit : 01 oct. 2022 20:44 Le plus sûr est de demander aux membres du forum qui possèdent une hp-48s/sx et / ou une hp-48g/gx/g+ de lancer un programme du genre

Code : Tout sélectionner

<< 5 "ABC" + >>
et d'attendre leurs réponses.
Sur 48SX et 48GX on obtient "5ABC".
Sur 28S on a un message d’erreur: Bad Argument Type.
Merci zpalm pour l'info ! :)
Le langage de la Prime a l'air vraiment puissant (et compact) et il ressemble bcp à un vrai langage informatique…
Cela dit j'aurais quand même besoin de consulter le manuel PDF pour tout comprendre ! :wink: :)

Concernant le RPL, l'idée d'utiliser les préfixes '1_k' et '1_M' est 100% fonctionnelle.
SAUF QUE… les zéros non significatifs de la partie frationnaire sont systématiquement supprimés (même en mode FIX) !

En clair, on peut avoir 1.05_k par ex.
Mais on n'obtiendra jamais :
1.00_k ; 50.0_M ; etc. Ces deux valeurs seront affichées sous la forme : 1_k ; 50_M… sans point décimal.

Sur hp-28, l'utilisation des unités se fait sur deux lignes.
Ex. :
1.05
'k'

… mais au moins, on n'a peut-être pas le problème précité avec les zéros. Je n'ai pas essayé.

CASE [test THEN … END] […] END
… ça je l'ai testé. Rien de très convaincant pour l'instant.
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 »