Étant donné un entier strictement positif, renvoyez le chiffre romain le plus court possible en utilisant uniquement la règle additive. La sortie doit comprendre zéro ou plus de chacun des caractères MDCLXVI
dans cet ordre. Le nombre 14
doit donc donner XIIII
plutôt que XIV
.
Les valeurs numériques des caractères sont M
= 1000, D
= 500, C
= 100, L
= 50, X
= 10, V
= 5, I
= 1.
Exemples
3
→ III
4
→ IIII
9
→ VIIII
42
→ XXXXII
796
→ DCCLXXXXVI
2017
→ MMXVII
16807
→ MMMMMMMMMMMMMMMMDCCCVII
4 -> IIII
est9 -> VIIII
aussi bien au lieu deIX
?VIIII
est la seule sortie autorisée pour 9.Réponses:
Anglais ordinaire ,
10591025678641451399 octetsEnregistré 34 octets en supprimant une interruption d'erreur. Puis sauvé 384 octets en jouant au golf. Vous avez ensuite enregistré 190 octets en combinant l'opération de division avec l'opération d'ajout ("z") dans une nouvelle opération ("p"). Puis sauvé 52 octets en jouant au golf.
Voici la version non golfée du code final, plus un piège d'erreur pour un nombre négatif:
la source
APL (Dyalog) ,
2522 octetsEssayez-le en ligne!
la source
/
) au lieu de reshape (⍴
) afin de pouvoir supprimer chacun et la réduction caténate (¨
et,/
).⎕
) et utiliser commute (⍨
) pour supprimer les parens et composer (∘
).{}
ou∇f∇
entourant la fonctionRétine ,
5742 octetsConvertit en unaire, puis remplace goulûment les grappes de
I
s par les dénominations supérieures dans l'ordre.Essayez-le en ligne
15 octets enregistrés grâce à Martin
la source
I
comme unité?Python 2 , 64 octets
Essayez-le en ligne!
Plutôt que de créer la chaîne de sortie depuis le début en prenant avidement la plus grande partie, cela la crée depuis la fin. Par exemple, le nombre de
I
estn%5
, puis le nombre deV
estn/5%2
, et ainsi de suite. Il s'agit d'une conversion de base mixte avec des rapports successifs de 5 et 2 alternés.Voici un équivalent itératif:
Python 2 , 68 octets
Essayez-le en ligne!
Les
M
fichiers doivent être traités séparément car un certain nombre d'entre eux peuvent être présents car il n'y a pas de chiffre plus grand. Ainsi, une fois les autres valeurs de lieu affectées, la valeur restante est convertie enM
's.A titre de comparaison, une stratégie gourmande (69 octets):
Python 2 , 69 octets
Essayez-le en ligne!
La valeur numérique actuelle
d
est divisée par 2 ou 5 pour produire le chiffre suivant. La valeur ded%3
nous dire lequel: sid%3==1
, diviser par2
; et sid%3==2
, divisez par 5.la source
Mathematica, 81 octets
Utiliser explicitement les valeurs et dériver les chiffres correspondants semble être un octet de plus:
la source
FromRomanNumeral@r
Excel,
236193161 octets43 octets enregistrés grâce à @ BradCÀ ce stade, la réponse appartient vraiment totalement à @ BradC . Encore 32 octets enregistrés.
Formaté:
la source
CONCATENATE
par&
entre chaque élément etQUOTIENT
parINT(A/B)
.REPT
déjà tronqué s'il n'est pas un entier , vous pouvez donc économiser 30 octets supplémentaires en les supprimant chacunINT()
. Économisez 2 de plus en remplaçant les deux1000
par1E3
(bien qu'Excel ne semble pas vouloir le conserver de cette façon une fois que vous appuyez sur Entrée).1E3
comportement. Réponse mise à jour.Perl 5 , 66 octets
65 octets de code +
-p
indicateur.Essayez-le en ligne!
Sans changer le nombre d'octets,
MDCLXVI=~/./g
peut être remplacé parM,D,C,L,X,V,I
; et--$|?2:5
par$|--*3+2
.Beaucoup plus long ( 99 octets ), il y a:
la source
CJam ,
3528 octets-7 octets grâce à Martin Ender
Essayez-le en ligne!
Explication
la source
C #, 127 octets
Une instruction ternaire purement codée utilisant la récursivité.
Version complète / formatée:
la source
n>0
est justen
.int
ne peut pas être implicitement converti en abool
.05AB1E ,
292625 octetsEssayez-le en ligne!
Explication
la source
JavaScript (ES6),
817569 octets6 octets enregistrés grâce à @Neil pour le portage de la réponse de @ Jörg Hülsermann
6 octets enregistrés grâce à @Shaggy
Cas de test:
Afficher l'extrait de code
la source
n%=x
dans larepeat
méthode pour économiser quelques octets.n=>'MDCLXVI'.replace(/./g,(c,i)=>c.repeat(n/a,n%=a,a/=i%2?5:2),a=1e3)
/// , 50 octets
Essayez-le en ligne!
Prend l'entrée en unaire, et j'utilise (ab) le champ de pied de page sur TIO pour l'entrée afin que la sortie soit précédée d'une nouvelle ligne.
la source
Python 3 ,
100 97 96 94 93 9190 octetsdef
; tableau comme paramètre par défaut réduit un espace d'indentation; déclaration de variable indésirable suppriméea%=
raccourci de 1 octet(a//i)
été supprimés[]
au prix d'un espace d'indentation, économisant ainsi 1 octet.Essayez-le en ligne!
la source
a%=i
est un octet plus court :)b
tant que variable dans la fonction. Cela supprime la nécessité des supports -b=1000,500,100,50,10,5,1
Cubix , 69
7480octetsEssayez-le en ligne!
Regardez-le courir
J'ai réussi à le compresser un peu plus, mais il y a encore quelques no-op embêtants, surtout sur la face supérieure.
52"IVXLCDM"U
mettez les diviseurs et les caractères nécessaires sur la pile. Les 5 et 2 seront utilisés pour réduire la valeur div / mod et les caractères seront supprimés après utilisation.UIN0/&0\&,/U
fait demi-tour sur la face supérieure et commence une longue tournée pour obtenir l'entrée et pousser 1000 sur la pile. Une première division est effectuée et un demi-tour surr
le prochain extrait de code. C'est un domaine que je cherchais à faire des économies.,r%ws;rr
début de la boucle divmod. diviser l'entier, faire pivoter le résultat loin du mod, puis réorganiser le haut de la pile pour réduire l'entrée, le diviseur actuel et diviser le résultat.3tus
amenez le personnage actuel en haut et échangez-le avec le résultat de division.!vsoUs(0;U
c'est la boucle d'impression. tandis que le résultat div est supérieur à 0, permutez avec la sortie de caractères, permutez en arrière, décrémentez, poussez un 0 et déposez-le. Sur 0, redirigez sur la pile pop (supprimez le résultat de la division) et autour du cube.\u;pwpsq,!@Urq;u
avec un peu de redirection, cela supprime le personnage de la pile, ramène les 5 et 2 en haut, les échange et les repousse vers le bas. Le reste est utilisé pour réduire le diviseur. Arrêtez-le s'il se réduit à 0, sinon poussez le 5 ou le 2 vers le bas et rentrez dans la boucle.la source
Mathematica, 130 octets
la source
Python 2 ,
10990 octetsEssayez-le en ligne!
la source
1000
peut être1e3
(si cela ne vous dérange pas que ce soit un flotteur qui ne devrait pas être un problème)float
, et vous ne pouvez pas multiplier une chaîne par un flottant: cPHP , 70 octets
Essayez-le en ligne!
la source
T-SQL, 164 bytes
Line breaks added for readability only.
This version is a lot longer (230 characters), but feels much more "SQL-like":
Makes a table m with all the char-value mappings, and then loops through finding the largest value <= the number, concatenating the matching character.
la source
Japt, 34 bytes
Test it online!
la source
JavaScript (ES6), 65 bytes
A recursive function.
How?
The second recursive call
f(n-a)
really should bef(n-a,a)
. By omitting the 2nd parameter,a
andi
are reinitialized (to 1000 and 0 respectively) each time a new Roman digit is appended to the final result. This causes more recursion than needed but doesn't alter the outcome of the function and saves 2 bytes.Test cases
Show code snippet
la source
J,
2623 bytes3 bytes saved thanks to Adám.
Try it online!
Similar to the APL answerbasically the same thing.la source
#.inv
instead of#:
?#.inv
instead of#:
, since something like2 #: 4
is0
, whilst2 #.inv 4
is1 0 0
#
is/
;~
is⍨
;$
is⍴
;&
is∘
;#:
is⊤
. The only difference is that you use infinity_
while you could use0
like the APL answer.Batch, 164 bytes
Takes input on STDIN.
la source
Oracle SQL, 456 bytes
Outputs:
Please note the actual size of the line is 460bytes, because it includes the input number (2849).
Ungolfed:
How it works: I calculate how many of each letter I need, by calculating the most I can get to with the higher value one (infinity for M), and then doing an integer division between the current letter's value and the result of that.
E.g. 2348, how many
C
s do I need?trunc((2348-mod(2348,500))/100)
= 3.Then, I
listagg
that letter together 3 times (exploitingCONNECT BY
to generate the 3 rows I need). Finally, Ilistagg
everything together.Kinda bulky, but most of it is the
select from dual
s in the conversion table and I can't really do much about that...la source
Java (OpenJDK 8),
119118 bytesTry it online!
Saved a byte thanks to @TheLethalCoder
la source
v
andi
in the first for loop to save a byte?Charcoal,
61 5046 bytesTry it online!
Explanation:
la source
Nν
is one byte shorter thanANν
,¬‹
is one byte shorter than subtracting 1, and if you use÷
(IntDivide) instead of∕
(Divide) then you can useφ
as the outer loop condition. However, I think you can get it down to 40 bytes by looping overMDCLXVI
directly instead.C++, 272 Bytes
la source
C, 183 Bytes
Same algorithm as before, just using plain c arrays instead of an std::map, partially inspired by @xnor's answer and using a string to store the letters.
la source
Common Lisp, 113 bytes
This is an anonymous function, returning the result as a string.
Ungolfed, with descriptive variable names and comments:
CL has built-in Roman numeral formatter. Sadly it doesn't work for numbers larger than 3999.
la source
Charcoal, 34 bytes
Originally based on @CarlosAlego's answer. A port of @xnor's Python solution is also 34 bytes:
Edit: A port of @xnor's other Python solution turns out to be 33 bytes!
Try it online! Link is to verbose version of code. Note that I've used
⁺׳﹪φ³±¹
instead of⁻׳﹪φ³¦¹
because the deverbosifier is currently failing to insert the separator.la source