Функция принимает век в римском формате и возращает в числовом

задача - принимать в функции век в римском формате и выводить в числовом Как сделал я- по сути функция не работает по непонятным причинам

function getCentury(str) {
  str.split('')
  let counter=0
  for (let i=0; i<str.length; i++) {
    let I, II, III, V, X
    I=1
    II=2
    III=3
    V=5
    X=10
    counter=counter+str[i]
    if (str[0]===1)  counter-=1
  }
  console.log(counter)
}
getCentury('XXI')


Ответы (1 шт):

Автор решения: OPTIMUS PRIME

Заметил, что можно ходить по строке справа налево. Если численное значение текущего символа меньше, чем предыдущего - вычесть его из суммы (IV: I < V → 5 - 1), если больше либо равен, суммировать:

XVII:       // sum = I (1)
  I == I    // sum += 1
  V > I     // sum += 5
  X > V     // sum += 10
            // 17

let test = [
  "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X",
  "XI", "XII", "XIII", "XIV", "XV", "XVI", "XVII", "XVIII", "XIX", "XX",
  "XXI", "XXII", "XXV", "XXX", "LXIV", "CCCLXIV", "CDLVI", "MMDI"
];

test.forEach( e => console.log(e + " → " + parseRoman(e)) );

/***/
function parseRoman(str) {
  let roman = {
    I: 1,
    V: 5,
    X: 10,
    L: 50,
    C: 100,
    D: 500,
    M: 1000
  };
  
  let sum = 0, last = 0;
  for( let i = str.length - 1; i >= 0; i-- ) {
    let curr = roman[ str[i] ]; // Конвертирует римский символ в число
    
    sum += (curr >= last) ? curr : -curr;
    last = curr;
  }
  
  return sum;
}

Проверять на валидность - отдельная история, нужно больше думать)

→ Ссылка