Entrada:
Un entero
Salida:
- Primero convierta el entero a su número romano equivalente.
- Luego convierta cada letra mayúscula de ese número romano a su valor decimal ASCII / UNICODE.
- Y generar la suma de esos.
Ejemplo:
1991 -> MCMXCI -> 77+67+77+88+67+73 -> 449
^ input ^ output
Números romanos: Aquí hay un convertidor de números romanos quizás útil.
Reglas de desafío:
- Se aplican las reglas estándar de números romanos, por lo que no hay formas alternativas como
IIII
o enVIIII
lugar deIV
yIX
. * - Las líneas de Macron sobre los números romanos más allá de 1,000 son
¯
(UNICODE nr. 175). Entonces una línea cuenta como+175
y dos como+350
. - Puede usar cualquier tipo de entrada y salida, siempre que represente los enteros.
- Los casos de prueba estarán en el rango de
1 - 2,147,483,647
.
* Reglas de números romanos (cita de Wikipedia):
Los números se forman combinando símbolos y sumando los valores, entonces
II
son dos (dos unos) yXIII
trece (diez y tres unos). Debido a que cada número tiene un valor fijo en lugar de representar múltiplos de diez, cien y así sucesivamente, según la posición, no hay necesidad de ceros de "mantenimiento de lugar", como en números como 207 o 1066; esos números se escriben comoCCVII
(dos cientos, cinco y dos unidades) yMLXVI
(mil, cincuenta, diez, cinco y uno).Los símbolos se colocan de izquierda a derecha en orden de valor, comenzando por el más grande. Sin embargo, en algunos casos específicos, para evitar que se repitan cuatro caracteres en sucesión (como
IIII
oXXXX
), la notación sustractiva se usa a menudo de la siguiente manera:
I
colocado antesV
oX
indica uno menos, entonces cuatro esIV
(uno menos que cinco) y nueve esIX
(uno menos que diez)X
colocado antesL
oC
indica diez menos, entonces cuarenta esXL
(diez menos de cincuenta) y noventa esXC
(diez menos de cien)C
colocado antesD
oM
indica cien menos, entonces cuatrocientos esCD
(cien menos de quinientos) y novecientos esCM
(cien menos de mil)
Por ejemplo,MCMIV
es mil novecientos cuatro, 1904 (M
es mil,CM
es novecientos yIV
es cuatro).Algunos ejemplos del uso moderno de los números romanos incluyen:
1954 comoMCMLIV
; 1990 comoMCMXC
; 2014 comoMMXIV
FUENTE
Reglas generales:
- Este es el código de golf , por lo que la respuesta más corta en bytes gana.
No permita que los lenguajes de código de golf lo desalienten de publicar respuestas con idiomas que no sean de código. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación. - Se aplican reglas estándar para su respuesta, por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados, programas completos. Tu llamada.
- Las lagunas predeterminadas están prohibidas.
- Si es posible, agregue un enlace con una prueba para su código.
- Además, agregue una explicación si es necesario.
Casos de prueba:
100 -> 67
1 -> 73
4 -> 159
22 -> 322
5000 -> 261
2016 -> 401
1000000000 -> 427
1991 -> 449
9999 -> 800
1111111111 -> 2344
2147483647 -> 5362
fuente
9999
->M(X)CMXCIX
->77+263+67+77+88+67+73+88
->800
y2147483647
->((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
. Así que he corregido el segundo, pero9999
fue correcto.2222222222
no está en el rango dado. También estoy de acuerdo con5362
.Respuestas:
Mathematica,
181173166151 bytesGolfed
Sin golf
La
RomanNumeral
implementación de Mathematica proporciona (IX) CMXCIX para 9999, por lo que el programa devuelve 971 para ese número.Tal como está escrito, un número romano del tipo ((...)) (...) ... devuelve una lista anidada de los códigos ASCII para los números romanos de longitud 4, ((...)) ... devuelve una lista de longitud 3, (...) ... devuelve una lista de longitud 2 y ... devuelve una lista de longitud 1. La línea final convierte esas reglas en el número apropiado de macrones para cada sección del lista, agrega esos macrones y luego suma toda la lista anidada para devolver la salida.
fuente
Python 3,
281278273269 bytesMi primer intento de codegolf, aquí vamos. Intenté hacerlo sin mirar la pregunta vinculada, por lo que probablemente sea terrible :)
8 bytes más pequeños, gracias a Gábor Fekete
Sin golf:
fuente
return 0 if n==0 else
conreturn 0if n<1else
f
cuando el nombre de la función esg
.n//9*10>=10*l
an//9>=l
para guardar un poco más.Ruby, 188 bytes
Una adaptación basada en mi vieja respuesta de Ruby para la conversión de números romanos . Pruébalo en línea!
fuente
Mathematica, 198 bytes
Desafortunadamente, la construcción no ayuda mucho aquí, aunque estoy seguro de que esto se puede jugar mucho más.
Nota: Evalúa
9999 -> 971
según aquí .fuente
Lote, 373 bytes.
Funciona mediante la traducción de cada dígito del número de acuerdo con una tabla de consulta para los valores de 1, 4, 5 y 9. Usos
M(V)
,M(X)
,(M(V))
y(M(X))
. Si lo prefiere(IV)
,(IX)
,((IV))
y((IX))
luego usarcall:l 77 509 261 511
ycall:l 252 859 436 861
respectivamente.fuente
JavaScript (ES6), 183 bytes
Nota: no sólo prefiere
(IV)
aM(V)
, pero también prefiere(VI)
a(V)M
; de hecho solo usará M al comienzo del número.fuente
Python, 263 bytes
fuente
R, 115 bytes
Entonces ... estoy publicando mi solución porque la pregunta me parece bastante interesante. Hice todo lo posible con R 's capacidades para hacer frente a los números romanos sin paquetes: Sólo puede introducir números entre
1
y3899
, como elas.roman
' s documentación explica.Es por eso que hice un poco de trampa al dar un rango entre
1
a en el bucle:es la longitud dela salida de (). De hecho, según este sitio web , el número romano más largo es (14 caracteres), que corresponde a11
14
for
as.roman(3899)
MMMDCCCXCIX
MMDCCCLXXXVIII
2888
.Además, no puede calcular
length
la salida de esta función.Si alguien ve una solución para resolver los problemas anteriores, no dude en comentar.
fuente
Python 3, 315 bytes
Versión sin golf:
Explicación: Esta versión utiliza un enfoque diferente, cuenta las apariciones de números romanos en el número.
[abs(((n-4)%5)-1)]
es el número deI
s en el número romano.[((n+10**g)//(10**g*5))%2for g in r(10)]
es el número deV,L,D,(V),(L),(D),((V)),((L)),((D))
s en el número.[(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)]
es el número deX,C,M,(X),(C),(M),((X)),((C)),((M))
s en el número.Luego, multiplica las ocurrencias con el valor del personaje y devuelve la suma del mismo.
fuente