Su tarea es convertir un entero positivo dado de un número arábigo a un número romano.
Las cosas se ponen difíciles cuando cuentas hasta 4000.
Los romanos hicieron esto agregando una línea sobre un símbolo para multiplicar ese símbolo por 1 000
. Sin embargo, los overlines no son exactamente visibles en ASCII. Además, hay dobles líneas para multiplicar un símbolo por 1 000 000
, y luego tres líneas para multiplicar un símbolo por 1 000 000 000
, etc.
Por lo tanto, decidí usar paréntesis para reemplazar los overlines.
Los símbolos se pueden colocar individualmente entre paréntesis. Por ejemplo, ambos (VI)
y (V)(I)
son representaciones válidas de 6 000
. (V)M
También es una representación válida de 6000.
(I)
Es una forma válida de representar 1 000
.
Casos de prueba
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
Puntuación
Este es el código de golf . El código más corto en bytes gana.
fuente
(IV)
una representación aceptable de 4000?Respuestas:
Mathematica, 67 bytes
Evita todos los problemas
M
al convertir la entrada a la base 1000 y convertir cada dígito por separado conRomanNumeral
. Luego los doblamos insertando(...)
desde la izquierda.Desafortunadamente, Mathematica representa ceros,
N
por lo que debemos deshacernos de ellos.fuente
RomanNumeral
podía hacerlo?MMMM
para4000
, solo comienza a trabajar para especificar en5000
(y luego obtiene el mismo problema para4000000
etc.). Incluso entonces, usa barras superpuestas en lugar de paréntesis. Si está de acuerdo con eso, debe decirlo en la especificación de desafío.JavaScript (ES6), 136 bytes
Para números menores de 4000, repite cada "letra" romana tantas veces como sea posible, utilizando la lista de "letras" romanas y sus valores decimales. De lo contrario, acumula recursivamente la respuesta de la división y el módulo con 1000. Afortunadamente, se
repeat
trunca para que no tenga que hacerlo yo mismo.fuente
Lisp común, 108
Sin golf
Pruebas
Dos pruebas dan resultados diferentes a los de la pregunta:
fuente
R, 134
No es la mejor opción, pero creo que la idea debería ser bastante similar a esta.
fuente
Pitón, 188
194-6 bytes de deshacerse de algunos espacios en blanco
Este desafío me devolvió a cuando estaba aprendiendo a programar ...
Puede que no sea la solución más corta, pero me divertí jugando al golf este problema.
¡Pruébalo!
fuente
Rubí,
137134130 bytesFunción recursiva que devuelve la cadena. Estoy tratando de descifrar las codificaciones numéricas un poco más si es posible, pero no estoy seguro de cómo.
Vaya, es prácticamente un puerto directo de la respuesta ES6 de @ Neil ahora.
fuente
Ruby,
185161144bytesMás de un año después de la publicación original, creo que aprendí algo sobre el golf.
Gracias Value Ink por sus valiosos comentarios.
fuente
gsub
puede tomar una cadena como primer argumento, eliminando la necesidad de sustituciones en un patrón regex yas.gsub! x,y
que lo hace automáticamente. Aparte de eso, probablemente pueda renunciar a la asignación de sua
matriz, ya que solo la usa una vez y la coloca directamente en laeach_slice
llamada."IVXXLCCDM".scan(/(.)(.)(.)/){|x,b,c|...
también funcionar[x]
es funcionalmente equivalente ar.(x)
cuando están involucradas lambdas stabbyr[x]
truco va a ser útil para todo mi golf recursivo en Ruby!TCL 134 bytes
Pruébelo aquí: https://rextester.com/BJC92885
fuente