Rutas
/
Arturo
Arturo
/
Ejercicios
/
Números romanos
Números romanos

Números romanos

Media

Introducción

Hoy en día, la mayoría de la gente del mundo usa los números arábigos (0–9). Pero si viajaras dos mil años atrás, descubrirías que la mayoría de los europeos usaba en su lugar los números romanos.

Para escribir un número romano usamos las siguientes letras latinas, cada una de las cuales tiene un valor:

M D C L X V I
1000 500 100 50 10 5 1

Un número romano es una secuencia de estas letras, y su valor es la suma de los valores de las letras. Por ejemplo, XVIII tiene el valor 18 (10 + 5 + 1 + 1 + 1 = 18).

Sin embargo, hay una regla que complica un poco las cosas: la misma letra no puede usarse más de tres veces seguidas. Eso significa que no podemos expresar números como el 4 con el aparentemente natural IIII. En su lugar, para esos números usamos un método de resta entre dos letras. Así que pensamos en el 4 no como 1 + 1 + 1 + 1, sino como 5 - 1. Y, aunque a nuestra mentalidad moderna le resulte un poco confuso, escribimos primero el número menor. Esto solo se aplica en los siguientes casos: 4 (IV), 9 (IX), 40 (XL), 90 (XC), 400 (CD) y 900 (CM).

¡El orden importa en los números romanos! Las letras (y los compuestos especiales anteriores) deben ordenarse de mayor a menor valor de izquierda a derecha.

Aquí tienes algunos ejemplos:

 105 => CV
---- => --
 100 => C
+  5 =>  V
 106 => CVI
---- => --
 100 => C
+  5 =>  V
+  1 =>   I
 104 => CIV
---- => ---
 100 => C
+  4 =>  IV

Y un último ejemplo más complejo:

 1996 => MCMXCVI
----- => -------
 1000 => M
+ 900 =>  CM
+  90 =>    XC
+   5 =>      V
+   1 =>       I

Instrucciones

Tu tarea consiste en convertir un número escrito con números arábigos a números romanos.

En este ejercicio solo nos ocupamos de los números romanos tradicionales, en los que el número más grande es MMMCMXCIX (o 3.999).

Note

Hay muchas formas distintas de convertir entre números arábigos y romanos. Te recomendamos empezar con un enfoque ingenuo para familiarizarte con el concepto de los números romanos y, después, buscar métodos más eficientes.

¡No dejes de ver nuestro vídeo Deep Dive al final para explorar los distintos enfoques que puedes seguir!

Instrucciones de Arturo

Para este ejercicio, tendrás que admitir dos formas distintas de llamar a la palabra stringify:

  1. Con el atributo roman (por ejemplo, stringify.roman 3999)
  2. Sin el atributo roman (por ejemplo, stringify 3999)

Para más información, consulta la documentación de attributes, así como la documentación de attr.

Caution

Además de attr, la función attrs es útil: devuelve todos los atributos de la llamada a la función como un diccionario.

¡Ten cuidado: estas dos funciones son destructivas!

La implementación de Arturo usa una «tabla de atributos».

Un ejemplo:

showAttributes: function [x][
    print attr 'question
    print attrs
    print attrs
]

showAttributes .question:"6 * 9" .answer:42 'arg

produce

6 * 9
[answer:42]
[]

En cada paso, vemos cómo se reduce el diccionario de atributos.

Conclusión: ten en cuenta que solo puedes obtener los atributos una vez. Si necesitas volver a consultar los atributos, captúralos al principio de tus funciones.

Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Arturo Exercism

¿Listo para empezar Números romanos?

Regístrate en Exercism para aprender y dominar Arturo con 79 ejercicios y mentoría humana real, todo gratis.

¡Análisis en profundidad de Números romanos!

Explora una variedad de soluciones distintas para este ejercicio tan complicado, desde la recursión hasta las búsquedas basadas en tablas, pasando por una solución que utiliza números de base mixta y algún que otro truco simple en Common Lisp.