MPO n°66 - Convertisseur en chiffres romains
Modérateur : Politburo
-
- 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
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.
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...
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
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.
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...
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...
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...
- babaorhum
- Fonctionne à 1200 bauds
- Messages : 454
- Enregistré le : 13 janv. 2013 19:44
- Localisation : Marseille-est
Re: MPO n°66 - Convertisseur en chiffres romains
Bonjour,
Bricolé sur ma TI92 :
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.
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
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
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
- badaze
- Fonctionne à 14400 bauds
- Messages : 8409
- Enregistré le : 12 févr. 2007 18:36
- Localisation : Pas très loin de Lyon
- Contact :
Re: MPO n°66 - Convertisseur en chiffres romains
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.
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.
- babaorhum
- Fonctionne à 1200 bauds
- Messages : 454
- Enregistré le : 13 janv. 2013 19:44
- Localisation : Marseille-est
Re: MPO n°66 - Convertisseur en chiffres romains
Oups,
oui, bien sûr badaze !
Je corrige.
oui, bien sûr badaze !
Je corrige.
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
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
- C.Ret
- Fonctionne à 9600 bauds
- Messages : 3422
- Enregistré le : 31 mai 2008 23:43
- Localisation : N 49°22 E 6°10
Re: MPO n°66 - Convertisseur en chiffres romains
J'ai du mal à compter comme un romain.
ID cela est-il possible ? Si oui, est-ce une réponse correcte pour 499 ?
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.
- babaorhum
- Fonctionne à 1200 bauds
- Messages : 454
- Enregistré le : 13 janv. 2013 19:44
- Localisation : Marseille-est
Re: MPO n°66 - Convertisseur en chiffres romains
Les règles sont bien expliquées sur cette page
pour 499, les romains écrivaient CDXCIX si je comprends bien, pas évident pour nous ...
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
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
- meridian
- Fonctionne à 1200 bauds
- Messages : 1151
- Enregistré le : 29 oct. 2014 05:08
- Localisation : Seine-Saint-Denis
Re: MPO n°66 - Convertisseur en chiffres romains
euh, sur la page, le DIX ne ferait pas plutôt 509 que 511 ?
-
- 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
Sympa ton pgm Babaorhum ! Pas de listes de mon côté :
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...
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
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...
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...
- jojo
- Fonctionne à 1200 bauds
- Messages : 405
- 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
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é !meridian a écrit :euh, sur la page, le DIX ne ferait pas plutôt 509 que 511 ?
- C.Ret
- Fonctionne à 9600 bauds
- Messages : 3422
- Enregistré le : 31 mai 2008 23:43
- Localisation : N 49°22 E 6°10
Re: MPO n°66 - Convertisseur en chiffres romains
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.
-
- 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
Une première version en C dans une casio Z-1Gr (sans les listes... )
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...
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);
}
}
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...
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...
-
- 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
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).
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...
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);}
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...
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...
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...
- jvernet
- Fonctionne à 14400 bauds
- Messages : 7958
- Enregistré le : 24 mai 2002 09:57
- Localisation : France 69
- Contact :
Re: MPO n°66 - Convertisseur en chiffres romains
Si
ne marche pas, je vois pas trop. A part stocker les valeurs dans un fichier externe...
JV
Code : Tout sélectionner
char *rm[14]={"M","CM",...,"I"};
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."
-
- 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
Yo !
Sur HP-41C de base (sans module, ni extra) en 167 octets (avec le END et le label), et sans aucun registre
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 !
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
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
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
- babaorhum
- Fonctionne à 1200 bauds
- Messages : 454
- Enregistré le : 13 janv. 2013 19:44
- Localisation : Marseille-est
Re: MPO n°66 - Convertisseur en chiffres romains
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) :
... 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 !
@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
@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
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