Votre tâche consiste à convertir un entier positif donné du chiffre arabe en chiffre romain.
Les choses deviennent difficiles quand on compte jusqu'à 4000.
Les romains l'ont fait en ajoutant une ligne au-dessus d'un symbole pour multiplier ce symbole par 1 000
. Cependant, les surlignages ne sont pas exactement affichables en ASCII. En outre, il existe des doubles surlignages pour multiplier un symbole par 1 000 000
, puis un triple surlignage pour multiplier un symbole par 1 000 000 000
, etc.
Par conséquent, j'ai décidé d'utiliser des parenthèses pour remplacer les surlignages.
Les symboles peuvent être placés individuellement entre parenthèses. Par exemple, les deux (VI)
et (V)(I)
sont des représentations valides de 6 000
. (V)M
est également une représentation valide de 6000.
(I)
est une façon valable de représenter 1 000
.
Cas de test
Input: 1
Output: I
Input: 2
Output: II
Input: 3
Output: III
Input: 4
Output: IV
Input: 15
Output: XV
Input: 40
Output: XL
Input: 60
Output: LX
Input: 67
Output: LXVII
Input: 400
Output: CD
Input: 666
Output: DCLXVI
Input: 3000
Output: MMM
Input: 3999
Output: MMMCMXCIX
Input: 4000
Output: M(V)
Input: 4999
Output: M(V)CMXCIX
Input: 6000
Output: (VI)
Input: 6000000
Output: ((VI))
Input: 6006000
Output: ((VI)VI)
Input: 6666666666
Output: (((VI)DCLXVI)DCLXVI)DCLXVI
Notation
C'est du code-golf . Le code le plus court en octets gagne.
la source
(IV)
une représentation acceptable de 4000?Réponses:
Mathematica, 67 octets
Évite tout problème avec la
M
conversion de l'entrée en base 1000 et la conversion de chaque chiffre séparément avecRomanNumeral
. Nous les replions ensuite en les insérant(...)
par la gauche.Malheureusement, Mathematica représente des zéros
N
et nous devons donc nous en débarrasser.la source
RomanNumeral
pouvoir le faire?MMMM
pour4000
, il ne commence à travailler que sur spec5000
(et vous obtenez le même problème pour4000000
etc.). Même dans ce cas, il utilise des barres supérieures au lieu de parenthèses. Si cela vous convient, vous devez le dire dans la spécification du défi.JavaScript (ES6), 136 octets
Pour les nombres inférieurs à 4000, répète chaque "lettre" romaine autant de fois que possible, en utilisant la liste des "lettres" romaines et leurs valeurs décimales. Sinon, construit récursivement la réponse de la division et du module avec 1000. Heureusement
repeat
tronque donc je n'ai pas à le faire moi-même.la source
Lisp commun, 108
Non golfé
Les tests
Deux tests donnent des résultats différents de ceux de la question:
la source
R, 134
Ce n'est pas la meilleure option, mais je pense que l'idée devrait être assez similaire à cela.
la source
Python, 188
194-6 octets pour se débarrasser de certains espaces
Ce défi m'a ramené à la première fois que j'ai appris à programmer ...
Ce n'est peut-être pas la solution la plus courte, mais je me suis amusé à jouer à ce problème.
Essaye le!
la source
Rubis,
137134130 octetsFonction récursive qui renvoie la chaîne. J'essaie de jouer un peu plus sur les encodages numériques si possible, mais je ne sais pas comment.
Oups, c'est pratiquement un port direct de la réponse ES6 de @ Neil maintenant.
la source
Rubis,
185161144octetsPlus d'un an après la publication originale, je pense avoir appris quelque chose sur le golf.
Merci Value Ink pour vos précieux commentaires.
la source
gsub
peut prendre une chaîne comme premier argument, supprimant le besoin de substitutions dans un modèle d'expression régulière cars.gsub! x,y
il le fait automatiquement. En dehors de cela, vous pouvez probablement simplement renoncer à l'affectation de votrea
tableau puisque vous ne l'utilisez qu'une seule fois et le placez directement dans l'each_slice
appel."IVXXLCCDM".scan(/(.)(.)(.)/){|x,b,c|...
fonctionne aussir[x]
fonctionnellement équivalent àr.(x)
chaque fois que des lambdas stabby sont impliquésr[x]
astuce va être utile pour tout mon futur golf récursif en rubis!TCL 134 octets
Essayez-le ici: https://rextester.com/BJC92885
la source