Замена регулярных выражений на split, исправление ошибок в коде
Всем привет!
Выполняю задание (написание калькулятора на js), с римскими и арабскими
В процессе написания кода запутался и посоветовали заменить регулярки на split
В переменных и методах не совсем разобрался. Если это решение хорошее то напишите пожалуйста как это сделать или напишите другое решение как исправить код чтобы калькулятор заработал.
//Первый блок
function calculator(string) {
const useStrict = {
z: 5000,
m: 2000,
cm: 900,
d: 500,
cd: 400,
c: 100,
xc: 90,
l: 50,
xl: 40,
x: 10,
ix: 9,
v: 5,
IV: 4,
i: 1
};
//Второй блок
function rom2arab(string) {
return string.toUpperCase().split('').reduce(function (s, v, i, arr) {
const [a, b] = [
useStrict[arr[i]],
useStrict[arr[i + 1]],
useStrict[arr[i + 2]],
];
return b > a ? s - a : s + a;
}, 0);
}
//Третий блок
function arab2rome(num) {
if (num < 1) return ' ';
let result = ' ';
for (var key in useStrict)
while (num >= useStrict[key]) {
result += key;
num -= useStrict[key];
}
return result;
}
//Четвертый блок
let letter = [];
string = string.replace(/[^IVXLCDMZ\d+\-*\/]/gi, ch => {
if (ch !== ' ') letter.push(ch);
return ' ';
});
//Пятый блок
if (letter.length > 0)
throw Error('Символы не допустимы, Вы ввели это: ' + letter);
let vars = string.split(/[+\-*\/]/g);
if (vars.length !== 2)
throw Error('Должно быть 2 операнда');
const isRome = /^[IVXLCDMZ]+$/i;
//Шестой блок
const r = vars.reduce((s, v) => s + isRome.test(v), 0);
if (r === 1)
throw Error('Оба числа должны быть записаны ирибскими или римскими цифрамы');
else if (r === 2)
vars = vars.map (v => rom2arab(v));
if (vars.some(v => v < 1 || v > 10))
throw Error('Допустимое значение оператора от 1 до 10 включительно');
let acr = string.match(/[+\-*\/]/)[0];
let result = Math.floor((vars.join(acr)));
return r === 0 ? result.toString() : arab2rome(result);
}
//пишем код здесь
module.exports = calculator; // Не трогайте эту строчку
Весь код не смотрел, а вот к преобразованиям арабские - римские есть вопросы. Вот здесь https://otvet.mail.ru/question/236055399 работающий код такого преобразования, но на Python. Попытался перевести его на JS, но не проверял:
function rome2int(s) { // римскую запись в целое число
let r = 0, p = 0;
let t = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000};
for (let i = s.length - 1; i >= 0; --i) {
let c = t[s[i]];
r += c >= p ? c : -c;
if (c > p) { p = c; }
}
return r;
}
function int2rome(v) { // целое число в римскую запись
let r = '';
let t = [
['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'],
['', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'],
['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM'],
['', 'M', 'MM', 'MMM']
];
for (let c of t) {
r = c[v % 10] + r;
v = Math.floor(v / 10);
}
return r;
}