MPO n°66 - Convertisseur en chiffres romains

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

caloubugs
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 434
Enregistré le : 05 juin 2014 22:23
Localisation : Dans le Gâtinais avec les abeilles, près de Fontainebleau

MPO n°66 - Convertisseur en chiffres romains

Message par caloubugs »

Je suis tombé sur cette page : p26-MS
Tirée du n°8 de Micro-Systèmes (nov 1979 quand même), et en voyant le programme proposé, je me suis bien dit qu'il y avait matière à optimisation. :slime:

Et que ça pourrait faire un MPO qui combine manipulation de nombres et de caractères.

D'autant plus que là, je trouve la solution plutôt tortueuse... 8O

J'ai fait un programme sur TI74 que je mettrai en ligne un peu plus tard.

Pour les règles, il faut suivre celles de la page mise en ligne qui respectent l'orthodoxie en la matière : on traite les chiffres un à un sans faire de raccourci.
Par exemple : 999 s'écrit CMXCIX et non IM qui est une simplification alternative qui n'a pas toujours été appliquée, et plutôt tardivement (voir aussi Wikipedia).

Et pour les plus téméraires, pourquoi pas faire un programme qui fasse la traduction inverse (pas sûr que l'on arrive alors dans du petit programme).

Bon amusement !

Sommaire des MPO
RetroGeek, mais pas que...
HP : 15C, 41CV, 48GX, 71B, 75C Canon X-07 Sharp PC 1403H, PC1500A, PC1600, PC-G850V Texas : CC40, 66, 74, 95, 92 Casio : PB-700, PB-1000, Z-1GR Psion 5mx, mais pas que...
Avatar du membre
babaorhum
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 454
Enregistré le : 13 janv. 2013 19:44
Localisation : Marseille-est

Re: MPO n°66 - Convertisseur en chiffres romains

Message par babaorhum »

Bonjour,

Bricolé sur ma TI92 :

Code : Tout sélectionner

Romain(n)
prgm
 Local rm,dc,k,i,j,res
 ClrIO
 {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"} -> rm
 {1000,900,500,400,100,90,50,40,10,9,5,4,1} -> dc
 "" -> res
 For k,1,dim(rm)
  int(n/(dc[k])) -> j
  n-j*dc[k] -> n
  If j>0 Then
   For i,1,j
    res & rm[k] -> res
   EndFor 
  EndIf
 EndFor
 Disp res
EndPrgm
Avec les listes c'est vrai que c'est plus facile ... 310 octets me dit VARLINK, sans compter les variables locales forcément ...
Il me semble qu'il y avait un pgm de ce type dans l'OP (j'ai des souvenirs de l'avoir adapté à mon ex 602P). Il faudra que je recherche ...
Au suivant !
EDIT : je n'ai pas précisé l'utilisation ... pas très compliqué une fois le programme entré ; dans "Home", entrer "Romain(1997)" par exemple puis return et MCMXCVII apparaît à l'affichage.
Modifié en dernier par babaorhum le 01 août 2015 17:52, modifié 3 fois.
BaBaoRhum
HP J728,200LX,1000CX,75C,71B,48GX,42s,41CX,32E,32Sii,28S,22s,21,16C,11C
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74,92,95 ; Canon X-07 ; TANDY EC-4026 ; Wp34S
Avatar du membre
badaze
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 8402
Enregistré le : 12 févr. 2007 18:36
Localisation : Pas très loin de Lyon
Contact :

Re: MPO n°66 - Convertisseur en chiffres romains

Message par badaze »

400 ce serait pas CD plutôt que ID ?
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
babaorhum
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 454
Enregistré le : 13 janv. 2013 19:44
Localisation : Marseille-est

Re: MPO n°66 - Convertisseur en chiffres romains

Message par babaorhum »

Oups,
oui, bien sûr badaze !
Je corrige. :oops:
BaBaoRhum
HP J728,200LX,1000CX,75C,71B,48GX,42s,41CX,32E,32Sii,28S,22s,21,16C,11C
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74,92,95 ; Canon X-07 ; TANDY EC-4026 ; Wp34S
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3418
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: MPO n°66 - Convertisseur en chiffres romains

Message par C.Ret »

J'ai du mal à compter comme un romain.

ID cela est-il possible ? Si oui, est-ce une réponse correcte pour 499 ?
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
babaorhum
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 454
Enregistré le : 13 janv. 2013 19:44
Localisation : Marseille-est

Re: MPO n°66 - Convertisseur en chiffres romains

Message par babaorhum »

Les règles sont bien expliquées sur cette page
pour 499, les romains écrivaient CDXCIX si je comprends bien, pas évident pour nous ...
BaBaoRhum
HP J728,200LX,1000CX,75C,71B,48GX,42s,41CX,32E,32Sii,28S,22s,21,16C,11C
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74,92,95 ; Canon X-07 ; TANDY EC-4026 ; Wp34S
Avatar du membre
meridian
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 1151
Enregistré le : 29 oct. 2014 05:08
Localisation : Seine-Saint-Denis

Re: MPO n°66 - Convertisseur en chiffres romains

Message par meridian »

euh, sur la page, le DIX ne ferait pas plutôt 509 que 511 ?
caloubugs
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 434
Enregistré le : 05 juin 2014 22:23
Localisation : Dans le Gâtinais avec les abeilles, près de Fontainebleau

Re: MPO n°66 - Convertisseur en chiffres romains

Message par caloubugs »

Sympa ton pgm Babaorhum ! Pas de listes de mon côté :

Code : Tout sélectionner

10 INPUT "N:";N
20 M=INT(N/1000):N=N-M*1000:IF M>9 THEN 10
30 W$=RPT$("M",M)
40 M=INT(N/100):N=N-M*100:X$="CDCM":GOSUB 80
50 M=INT(N/10):N=N-N*10:X$="XLXC":GOSUB 80
60 M=INT(N):X$="IVIX":GOSUB 80
70 PRINT W$:PAUSE:END
80 IF M=9 THEN W$=W$&SEG$(X$,3,2):RETURN
90 IF M=4 THEN W$=W$&SEG$(X$,1,2):RETURN
100 IF M>4 THEN W$=W$&SEG$(X$,2,1):M=M-5
110 W$=W$&RPT$(SEG$(X$,1,1),M):RETURN
357 octets utilisés.

Je bénéficie d'une fonction de la ti74 (RPT$) qui permet facilement de copier plusieurs instances d'une chaine.
A voir sur d'autres bécanes...
RetroGeek, mais pas que...
HP : 15C, 41CV, 48GX, 71B, 75C Canon X-07 Sharp PC 1403H, PC1500A, PC1600, PC-G850V Texas : CC40, 66, 74, 95, 92 Casio : PB-700, PB-1000, Z-1GR Psion 5mx, mais pas que...
Avatar du membre
jojo
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 403
Enregistré le : 28 juin 2006 21:28
Localisation : Entre la France, la Suisse et l'Italie ... dans la vallée du bien décolleté.

Re: MPO n°66 - Convertisseur en chiffres romains

Message par jojo »

meridian a écrit :euh, sur la page, le DIX ne ferait pas plutôt 509 que 511 ?
Je pense aussi ! 511 devrait s'écrire DXI ... enfin c'est comme cela que je l'aurais fait écrire à mes élèves si j'étais encore en activité ! :wink:
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3418
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: MPO n°66 - Convertisseur en chiffres romains

Message par C.Ret »

babaorhum a écrit :Les règles sont bien expliquées sur cette page
pour 499, les romains écrivaient CDXCIX si je comprends bien, pas évident pour nous ...

Merci babaorum, ces explications sont exactement ce dont j'avais besion. Les codes, très courts, que j'ai composés sont donc aussi très faux. J'avais misé trop petit. Me reste donc à corriger cela et optimiser.
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.
caloubugs
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 434
Enregistré le : 05 juin 2014 22:23
Localisation : Dans le Gâtinais avec les abeilles, près de Fontainebleau

Re: MPO n°66 - Convertisseur en chiffres romains

Message par caloubugs »

Une première version en C dans une casio Z-1Gr (sans les listes... :roll: )

Code : Tout sélectionner

char *sch(m,u,c,d)
char m,u,c,d;
{
char sch[5];char i,j=0;
if(m%5==4)
 {
 sch[0]=u;
 if(m==4)sch[1]=c;
  else sch[1]=d;
 sch[2]=0;
 }
else
 {
 if(m>4)
  {
  sch[0]=c;m-=5;j=1;
  }
 for(i=0;i<m;i++)sch[i+j]=u;
 sch[j+m]=0;
 }
return(sch);
}

main()
{
int n;char m,i,res[25];
clrscr();printf("n:");
scanf("%d",&n);res[0]=0;
m=(int)n/1e3;n=n%1000;
if(m<10)
 {
 for(i=0;i<m;i++)
  strcat(res,"M");
 m=(int)n/100;n=n%100;
 strcat(res,sch(m,67,68,77));
 m=(int)n/10;n=n%10;
 strcat(res,sch(m,88,76,67));
 strcat(res,sch(n,73,86,88));
 printf("%s",res);
 }
}
Je vais essayer de m'inspirer du code de Babaorhum... C'est quand même long ici.
Le C c'est pas génial sur les manipulations de caractères...
RetroGeek, mais pas que...
HP : 15C, 41CV, 48GX, 71B, 75C Canon X-07 Sharp PC 1403H, PC1500A, PC1600, PC-G850V Texas : CC40, 66, 74, 95, 92 Casio : PB-700, PB-1000, Z-1GR Psion 5mx, mais pas que...
caloubugs
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 434
Enregistré le : 05 juin 2014 22:23
Localisation : Dans le Gâtinais avec les abeilles, près de Fontainebleau

Re: MPO n°66 - Convertisseur en chiffres romains

Message par caloubugs »

Une version en C plus courte...
J'ai l'immense plaisir de me replonger dans ce langage (ça m'aura rajeuni de 25 ans tiens), et la Z-1Gr a quelques subtilités qui rendent le programme un peu lourd sur la partie initialisation des données (on ne peut pas initialiser directement un tableau, il faut le faire élément par élément, contraire aux règles ANSI C).

Code : Tout sélectionner

main(){
char *rm[14],res[25],i,j,k;int n,dc[13];
rm[0]="M";rm[1]="CM";rm[2]="D";
rm[3]="CD";rm[4]="C";rm[5]="XC";
rm[6]="L";rm[7]="XL";rm[8]="X";
rm[9]="IX";rm[10]="V";rm[11]="IV";rm[12]="I";
dc[0]=1e3;dc[1]=900;dc[2]=500;dc[3]=400;
dc[4]=100;dc[5]=90;dc[6]=50;dc[7]=40;
dc[8]=10;dc[9]=9;dc[10]=5;dc[11]=4;dc[12]=1;
printf ("n:");scanf ("%d",&n);
for(i=0;i<13;i++){
 j=(int) n/dc[i];n=n%dc[i];
 for(k=0;k<j;k++)strcat(res,rm[i]);}
printf("%s",res);}
Dommage, le coeur du pgm est vraiment court du coup.
S'il y a des experts pour améliorer l'initialisation, je suis preneur...

En tout cas, j'étais à mille lieues de trouver cette idée... Merci pour le tuyau... :wink:
RetroGeek, mais pas que...
HP : 15C, 41CV, 48GX, 71B, 75C Canon X-07 Sharp PC 1403H, PC1500A, PC1600, PC-G850V Texas : CC40, 66, 74, 95, 92 Casio : PB-700, PB-1000, Z-1GR Psion 5mx, mais pas que...
Avatar du membre
jvernet
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7958
Enregistré le : 24 mai 2002 09:57
Localisation : France 69
Contact :

Re: MPO n°66 - Convertisseur en chiffres romains

Message par jvernet »

Si

Code : Tout sélectionner

char *rm[14]={"M","CM",...,"I"};
ne marche pas, je vois pas trop. A part stocker les valeurs dans un fichier externe...

JV
"l'ordinateur et l'homme sont les deux opposés les plus intégraux qui existent. L'homme est lent, peu rigoureux et très intuitif. L'ordinateur est super rapide, très rigoureux et complètement con."
cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2143
Enregistré le : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: MPO n°66 - Convertisseur en chiffres romains

Message par cgh »

Yo !

Sur HP-41C de base (sans module, ni extra) en 167 octets (avec le END et le label), et sans aucun registre

Code : Tout sélectionner

 01*LBL "ROMAIN"
 02 CF 00
 03 CF 01
 04 CF 02
 05 SF 03
 06 CLA
 07*LBL 14
 08 ENTER^
 09 FS? 03
 10 1 E3
 11 FS? 02
 12 100
 13 FS? 01
 14 10
 15 FS? 00
 16 1
 17 X>Y?
 18 GTO 13
 19 MOD
 20 X<>Y
 21 LASTX
 22 /
 23 XEQ IND X
 24*LBL 13
 25 RDN
 26 FS?C 01
 27 SF 00
 28 FS?C 02
 29 SF 01
 30 FS?C 03
 31 SF 02
 32 FS? 00
 33 XEQ IND X
 34 FC?C 00
 35 GTO 14
 36*LBL 00
 37 AVIEW
 38 RTN
 39*LBL 11
 40 FS? 00
 41 "`I"
 42 FS? 01
 43 "`X"
 44 FS? 02
 45 "`C"
 46 FS? 03
 47 "`M"
 48 RTN
 49*LBL 12
 50 FS? 00
 51 "`V"
 52 FS? 01
 53 "`L"
 54 FS? 02
 55 "`D"
 56 RTN
 57*LBL 03
 58 XEQ 11
 59*LBL 02
 60 XEQ 11
 61*LBL 01
 62 XEQ 11
 63 RTN
 64*LBL 04
 65 XEQ 11
 66 FS? 03
 67 GTO 03
 68*LBL 05
 69 GTO 12
 70*LBL 08
 71*LBL 07
 72*LBL 06
 73 XEQ 12
 74 5
 75 -
 76 GTO IND X
 77*LBL 09
 78 FS? 00
 79 "`IX"
 80 FS? 01
 81 "`XC"
 82 FS? 02
 83 "`CM"
 84 END
Note: Le caractere ` est le signe ALPHA-APPEND (SHIFT ASN)

Mettre le nombre a convertir en X puis XEQ [ALPHA]ROMAIN[ALPHA] et le nombre romain est affiche et est stocke en ALPHA.

Par exemple, 1999 XEQ [ALPHA]ROMAIN[ALPHA] renverra MCMXCIX

Edit: Mise a jour - J'avais oublie le cas des milliers avec le 4 !
Il y a ceux qui voient les choses telles qu'elles sont et se demandent pourquoi, et il y a ceux qui imaginent les choses telles qu'elles pourraient être et se disent... pourquoi pas? - George Bernard Shaw
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque
Avatar du membre
babaorhum
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 454
Enregistré le : 13 janv. 2013 19:44
Localisation : Marseille-est

Re: MPO n°66 - Convertisseur en chiffres romains

Message par babaorhum »

Hello,
@Caloubugs, je ne connais pas bien le C, mais en simple basic, on peut faire des DATAs - par exemple, sur mon tout petit PC-1245 (et ca doit marcher sur tous les autres) :

Code : Tout sélectionner

1 INPUT N : RESTORE 7 : DIM R$(0)*15
2 FOR K = 1 TO 13 : READ L : U = INT(L/N) : IF U>=1 THEN GOSUB 4
3 NEXT K : PRINT R$(0) : CLEAR : END
4 RESTORE 6 : FOR I=1 TO K : READ T$ : NEXT I : FOR I=1 TO U : R$(0)=R$(0)+T$
5 N = N-L : NEXT I : RESTORE 7 : FOR I = 1 TO K : READ L : NEXT I : RETURN
6 DATA "M","CM","D","CD","C","XC","L","XL","X","IX,"V","IV","I"
7 DATA 1000,900,500,400,100,90,50,40,10,9,5,4,1
... en 239 octets - à améliorer certainement du côté des boucles - mais hélas, avec création d'une variable R$(0) de 15 caractères pour empiler le résultat - on ne peut pas le faire directement à l'affichage sur ce pocket ("PRINT T$;" n'est pas accepté ... dommage ...)

@cgh, tu peux nous guider un peu sur le fonctionnement de ton pgm stp ? je nage !
BaBaoRhum
HP J728,200LX,1000CX,75C,71B,48GX,42s,41CX,32E,32Sii,28S,22s,21,16C,11C
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74,92,95 ; Canon X-07 ; TANDY EC-4026 ; Wp34S
Répondre

Retourner vers « Tous les Pockets »