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