Answer

Answer

t.me/js_test

Ответ:

const nominals = {
  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,
};

class RomanNumerals {
  static toRoman(num) {
    let str = "";
    for (const i in nominals) {
      while (num >= nominals[i]) {
        str += i;
        num -= nominals[i];
      }
    }
    return str;
  }

  static fromRoman(str) {
    return str.match(/CM|CD|XC|XL|IX|IV|\w/g).reduce((acc, el) => acc + nominals[el], 0);
  }
}

Объяснение:

Для начала создадим объект nominals который будет хранить все возможные варианты цифр, важно заметить что тут есть такие цифры как например 4 (IV) - это нужно для того чтобы мы смогли её отделить от остальных сочетаний. Первый метод toRoman идёт по ключам объекта nominals и если num больше либо равен значению по ключу то прибавляем к результату ключ а от num отнимаем значение пока не дойдём до конца, затем возвращаем результат. Второй метод fromRoman отделяет все части числа с помощью метода String.match, конвертирует эти числа в обычные с помощью объекта nominals и складывает всё в одно число.

Код для проверки:

const nominals = {
  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,
};

class RomanNumerals {
  static toRoman(num) {
    let str = "";
    for (const i in nominals) {
      while (num >= nominals[i]) {
        str += i;
        num -= nominals[i];
      }
    }
    return str;
  }

  static fromRoman(str) {
    return str.match(/CM|CD|XC|XL|IX|IV|\w/g).reduce((acc, el) => acc + nominals[el], 0);
  }
}

console.log(RomanNumerals.toRoman(1000)); // 'M'
console.log(RomanNumerals.toRoman(4)); // 'IV'
console.log(RomanNumerals.toRoman(1)); // 'I'
console.log(RomanNumerals.toRoman(1990)); // 'MCMXC'
console.log(RomanNumerals.toRoman(2008)); // 'MMVIII'

console.log(RomanNumerals.fromRoman("XXI")); // 21
console.log(RomanNumerals.fromRoman("I")); // 1
console.log(RomanNumerals.fromRoman("IV")); // 4
console.log(RomanNumerals.fromRoman("CMVIII")); // 908
console.log(RomanNumerals.fromRoman("MDCLXVI")); // 1666

Report Page