Cada solución que he encontrado usa el siguiente objeto.
function converter(num) { var romanKeys = {M:1000,CM:900,D:500,CD:400,C:100,XC:90,L:50,XL:40,X:10,IX:9,V:5,IV:4,I:1}Cuando intenté resolver el problema yo mismo, no estaba muy seguro de qué números romanos eran redundantes al construir el objeto. Proceduralmente, ¿cómo llegamos a este objeto? Por ejemplo, ¿cómo sé que "VI: 6" es innecesario pero "IV: 4" sí lo es?
Cuando un símbolo aparece después de un símbolo mayor (o igual) se agrega Ejemplo: VI = V + I = 5 + 1 = 6 Ejemplo: LXX = L + X + X = 50 + 10 + 10 = 70
Pero si el símbolo aparece antes de un símbolo más grande se resta Ejemplo: IV = V − I = 5 − 1 = 4 Ejemplo: IX = X − I = 10 − 1 = 9
Puedo colocarme antes de V (5) y X (10) para hacer 4 y 9.
X se puede colocar antes de L (50) y C (100) para hacer 40 y 90.
C se puede colocar antes de D (500) y M (1000) para hacer 400 y 900.
Cuando está escaneando un número romano, está mirando de izquierda a derecha en cada símbolo y si aparece antes de un símbolo más grande, los toma juntos, hace la resta y lo suma al resultado, luego pasa al símbolo después de ellos. De lo contrario, toma un solo símbolo y agrega su valor al resultado y pasa al siguiente símbolo.
Por ejemplo para XIV:
1) result = 0 2) X < I => result += 10 (result = 10) 3) I < V => result += (5-1) (result = 14)Tenga en cuenta que si está utilizando ese mapeo, solo necesita las combinaciones en las que el segundo símbolo es mayor que el primero para el que se aplica la regla de resta, como se indicó anteriormente (CM, CD, XC, XL, IX, IV).
Tener algo como XI en ese mapeo le daría un resultado incorrecto. Para XIV tendrás XI (11) + V (5) = 16, no X (10) + IV (4) = 14.