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
IIIIo enVIIIIlugar deIVyIX. * - 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+175y 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
IIson dos (dos unos) yXIIItrece (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
IIIIoXXXX), la notación sustractiva se usa a menudo de la siguiente manera:
Icolocado antesVoXindica uno menos, entonces cuatro esIV(uno menos que cinco) y nueve esIX(uno menos que diez)Xcolocado antesLoCindica diez menos, entonces cuarenta esXL(diez menos de cincuenta) y noventa esXC(diez menos de cien)Ccolocado antesDoMindica cien menos, entonces cuatrocientos esCD(cien menos de quinientos) y novecientos esCM(cien menos de mil)
Por ejemplo,MCMIVes mil novecientos cuatro, 1904 (Mes mil,CMes novecientos yIVes 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->800y2147483647->((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, pero9999fue correcto.2222222222no está en el rango dado. También estoy de acuerdo con5362.Respuestas:
Mathematica,
181173166151 bytesGolfed
Sin golf
La
RomanNumeralimplementació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 elseconreturn 0if n<1elsefcuando el nombre de la función esg.n//9*10>=10*lan//9>=lpara 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 -> 971segú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 511ycall:l 252 859 436 861respectivamente.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
1y3899, como elas.roman' s documentación explica.Es por eso que hice un poco de trampa al dar un rango entre
1a 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 a1114foras.roman(3899)MMMDCCCXCIXMMDCCCLXXXVIII2888.Además, no puede calcular
lengthla 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 deIs 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