Top.Mail.Ru
Ответы

Замена регулярных выражений на 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, но не проверял:

12345678910111213141516171819202122232425
 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;
}