Конвертер римских чисел

Римские числа представлены с помощью семи «цифр»: I, V, X, L, C, D и M.

Символ        Значение
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

Например, чтобы записать число 2 нужно поставить рядом две единицы — II , 12 это десять и два — XII , а 27 это двадцать, пять и два — XXVII . Запись ведётся слева направо от большего разряда к меньшему.

Однако, есть особенность. Например, четыре — это не IIII , а IV. Вместо того чтобы складывать четыре единицы можно отнять одну от пяти и получить более короткую запись. Аналогично записывается девять как IX.

Всего есть 6 случаев когда применяется вычитание:

Итак, дана римская запись числа — нужно вернуть обыкновенную, десятичную. Число на входе в пределах [1 .. 3999].

Примеры:

romanToInt('III') === 3;
romanToInt('IV') === 4;
romanToInt('IX') === 9;
// L = 50, V = 5, III = 3
romanToInt('LVIII') === 58;
// M = 1000, CM = 900, XC = 90 and IV = 4
romanToInt('MCMXCIV') === 1994;

Решение

Сперва заведём словарь соответствия символов и значений, как указано в условии.

const sym2num = {
	'M': 1000,
  'D': 500, 
  'C': 100,
  'L': 50, 
  'X': 10,
  'V': 5,
  'I': 1
};

Решение «в лоб» — пробегаемся по строке слева направо и накапливаем сумму.

let res = 0;

for (let i = 0; i < s.length; i++) {
	res += sym2num[s[i]];
}

Проверим как это работает на примере:

Input: LVIII

- LVIII; res = 0 + 50;
  ^
- LVIII; res = 50 + 5; 
   ^
- LVIII; res = 55 + 1; 
    ^
- LVIII; res = 56 + 1; 
     ^
- LVIII; res = 57 + 1; 
      ^

Result: 58

Отлично!