Contribution:
Un nombre entier.
Production:
- Convertissez d'abord l'entier en son chiffre romain équivalent.
- Convertissez ensuite chaque lettre majuscule de ce chiffre romain en leur valeur décimale ASCII / UNICODE.
- Et produire la somme de ceux-ci.
Exemple:
1991 -> MCMXCI -> 77+67+77+88+67+73 -> 449
^ input ^ output
Chiffres romains: voici un convertisseur de chiffres romains peut-être utile.
Règles du défi:
- Les règles standard du chiffre romain sont appliquées, donc aucune autre forme comme
IIII
ouVIIII
au lieu deIV
etIX
. * - Les lignes Macron au-dessus des 1000 chiffres romains sont
¯
(UNICODE nr. 175). Donc une ligne compte+175
et deux comme+350
. - Vous êtes autorisé à utiliser tout type de type d'entrée et de sortie, tant qu'il représente les entiers.
- Les cas de test seront de l'ordre de
1 - 2,147,483,647
.
* Règles du chiffre romain (citation de Wikipedia):
Les nombres sont formés en combinant des symboles et en ajoutant les valeurs, il en
II
est de même de deux (deux) et deXIII
treize (dix et trois). Parce que chaque chiffre a une valeur fixe plutôt que de représenter des multiples de dix, cent et ainsi de suite, selon la position, il n'est pas nécessaire de mettre des zéros de "placement", comme dans les nombres comme 207 ou 1066; ces nombres sont écrits commeCCVII
(deux centaines, cinq et deux) etMLXVI
(mille, cinquante, dix, cinq et un).Les symboles sont placés de gauche à droite par ordre de valeur, en commençant par le plus grand. Cependant, dans quelques cas spécifiques, pour éviter que quatre caractères ne se répètent successivement (comme
IIII
ouXXXX
), la notation soustractive est souvent utilisée comme suit:
I
placé avantV
ouX
indique un de moins, donc quatre estIV
(un de moins de cinq) et neuf estIX
(un de moins de dix)X
placé avantL
ouC
indique dix de moins, donc quarante estXL
(dix de moins de cinquante) et quatre-vingt-dix estXC
(dix de moins de cent)C
placé avantD
ouM
indique cent de moins, donc quatre cents estCD
(cent de moins de cinq cents) et neuf cents estCM
(cent de moins de mille)
Par exemple,MCMIV
est mille neuf cent quatre, 1904 (M
est un millier,CM
est neuf centIV
quatre).Voici quelques exemples de l'utilisation moderne des chiffres romains:
1954 asMCMLIV
; 1990 commeMCMXC
; 2014 commeMMXIV
SOURCE
Règles générales:
- C'est le code-golf , donc la réponse la plus courte en octets l'emporte.
Ne laissez pas les langues de golf de code vous décourager de publier des réponses avec des langues autres que le golf de code. Essayez de trouver une réponse aussi courte que possible pour «n'importe quel» langage de programmation. - Des règles standard s'appliquent à votre réponse, vous êtes donc autorisé à utiliser STDIN / STDOUT, des fonctions / méthodes avec les paramètres appropriés, des programmes complets. Ton appel.
- Les failles par défaut sont interdites.
- Si possible, veuillez ajouter un lien avec un test pour votre code.
- Veuillez également ajouter une explication si nécessaire.
Cas de test:
100 -> 67
1 -> 73
4 -> 159
22 -> 322
5000 -> 261
2016 -> 401
1000000000 -> 427
1991 -> 449
9999 -> 800
1111111111 -> 2344
2147483647 -> 5362
la source
9999
->M(X)CMXCIX
->77+263+67+77+88+67+73+88
->800
et2147483647
->((MMCXLV)MMCDLXXX)MMMDCXLVII
->427+427+417+438+426+436 + 252+252+242+243+251+263+263+263 + 77+77+77+68+67+88+76+86+73+73
->5362
. J'ai donc corrigé la seconde, mais9999
c'était correct.2222222222
n'est pas dans la plage donnée. Je suis également d'accord avec5362
.Réponses:
Mathematica,
181173166151 151 octetsGolfé
Non golfé
L'
RomanNumeral
implémentation de Mathematica donne (IX) CMXCIX pour 9999, et donc le programme renvoie 971 pour ce nombre.Tel qu'écrit, un chiffre romain du type ((...)) (...) ... renvoie une liste imbriquée des codes ASCII pour les chiffres romains de longueur 4, ((...)) ... renvoie une liste de longueur 3, (...) ... renvoie une liste de longueur 2, et ... retourne une liste de longueur 1. La dernière ligne convertit ces règles en le nombre approprié de macrons pour chaque section de la , ajoute ces macrons, puis additionne toute la liste imbriquée pour renvoyer la sortie.
la source
Python 3,
281278273269 octetsMa première tentative de codegolf, c'est parti. J'ai essayé de le faire sans regarder la question liée, donc c'est probablement terrible :)
8 octets de moins, grâce à Gábor Fekete
Non golfé:
la source
return 0 if n==0 else
parreturn 0if n<1else
f
lorsque le nom de la fonction estg
.n//9*10>=10*l
àn//9>=l
pour en enregistrer davantage.Rubis, 188 octets
Une adaptation basée sur mon ancienne réponse Ruby pour la conversion des chiffres romains . Essayez-le en ligne!
la source
Mathematica, 198 octets
Malheureusement, la fonction intégrée n'aide pas beaucoup ici, même si je suis sûr que cela peut être joué beaucoup plus.
Remarque: Évalue
9999 -> 971
selon ici .la source
Lot, 373 octets
Fonctionne en traduisant chaque chiffre du numéro en fonction d'une table de consultation pour les valeurs 1, 4, 5 et 9. Les utilisations
M(V)
,M(X)
,(M(V))
et(M(X))
. Si vous préférez(IV)
,(IX)
,((IV))
et((IX))
puis utilisercall:l 77 509 261 511
etcall:l 252 859 436 861
respectivement.la source
JavaScript (ES6), 183 octets
Note: préfère non seulement
(IV)
àM(V)
, mais préfère aussi(VI)
à(V)M
; en fait, il n'utilisera M qu'au tout début du numéro.la source
Python, 263 octets
la source
R, 115 octets
Alors ... je poste ma solution parce que je trouve la question assez intéressante. Je faisais de mon mieux avec R « s capacités pour faire face aux chiffres romains sans paquets: vous ne pouvez saisir les numéros entre
1
et3899
, comme leas.roman
» s documentation explique.C'est pourquoi j'ai un peu triché en donnant une plage entre
1
to dans la boucle:c'est la longueur dela sortie de (). En fait, selon ce site , le plus long chiffre romain est (14 caractères), ce qui correspond à .11
14
for
as.roman(3899)
MMMDCCCXCIX
MMDCCCLXXXVIII
2888
De plus, vous ne pouvez pas calculer
length
la sortie de cette fonction.Si quelqu'un voit une solution pour résoudre les problèmes ci-dessus, n'hésitez pas à commenter.
la source
Python 3, 315 octets
Version non golfée:
Explication: Cette version utilise une approche différente, elle compte les occurrences de chiffres romains dans le nombre.
[abs(((n-4)%5)-1)]
est le nombre deI
s dans le chiffre romain.[((n+10**g)//(10**g*5))%2for g in r(10)]
est le nombre deV,L,D,(V),(L),(D),((V)),((L)),((D))
s dans le nombre.[(n%(10**g*5))//(10**g*4)+max((n%(10**g*5)%(10**g*4)+10**(g-1))//(10**g),0)for g in r(1,10)]
est le nombre deX,C,M,(X),(C),(M),((X)),((C)),((M))
s dans le nombre.Il multiplie ensuite les occurrences par la valeur du caractère et renvoie la somme de celui-ci.
la source