Есть ли какая-то разница в коде? Один работает, а второй нет
Есть ли какая-то разница между ними? Вроде абсолютно одинаковые, но второй не работает. Подскажите, в чем причина?
Это первый код
function getNums(string) {
return (string.split(/[\ \-\+\*\/]+/));
}
function getOperator(string) {
let operatorIndex = string.search(/[-\+\*\/]/);
return (string[operatorIndex]);
}
function calc(nums, operator) {
nums.forEach(function(item) {
if (item < 1 || item > 10) {
throw new Error();
}
});
switch (operator) {
case '-':
return (nums[0] - nums[1]);
case '+':
return (Number(nums[0]) + Number(nums[1]));
case '*':
return (nums[0] * nums[1]);
case '/':
return (nums[0] / nums[1]);
default:
throw new Error();
}
}
function toArabic(roman) {
roman = roman.toUpperCase();
let lookup = {
I: 1,
V: 5,
X: 10,
L: 50,
C: 100,
D: 500,
M: 1000
},
arabic = 0,
i = roman.length;
while (i--) {
if (lookup[roman[i]] < lookup[roman[i + 1]])
arabic -= lookup[roman[i]];
else arabic += lookup[roman[i]];
}
return arabic;
}
function toRoman(num) {
let lookup = {
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
},
roman = '',
i;
for (i in lookup) {
while (num >= lookup[i]) {
roman += i;
num -= lookup[i];
}
}
return roman;
}
function calculator(string) {
let nums = getNums(string);
if (nums.length != 2) throw new Error();
let operator = getOperator(string);
let result;
if (Number(nums[0]) && Number(nums[1])) {
result = Math.floor(calc(nums, operator));
} else
if (!Number(nums[0]) && !Number(nums[1])) {
let arabicNums = [toArabic(nums[0]), toArabic(nums[1])];
result = toRoman(Number(calc(arabicNums, operator)));
} else {
throw new Error();
}
return (String(result));
}
Вот второй
function getNums(string) {
return (string.split(/[\ \-\+\*\/]+/));
}
function getOperator(string) {
let operatorIndex = string.search(/[-\+\*\/]/);
return (string[operatorIndex]);
}
function calc(nums, operator) {
nums.forEach(function(item) {
if (item < 1 || item > 10) {
throw new Error();
}
});
switch (operator) {
case '-':
return (nums[0] - nums[1]);
case '+':
return (Number(nums[0]) + Number(nums[1]));
case '/':
return (nums[0] / nums[1]);
case '*':
return (nums[0] * nums[1]);
default:
throw new Error();
}
}
function toArabic(roman) {
roman = roman.toUpperCase();
let lookup = {
I: 1,
V: 5,
X: 10,
L: 50,
C: 100,
D: 500,
M: 1000
},
arabic = 0,
i = roman.length;
while (i--) {
if (lookup[roman[1]] < lookup[roman[i + 1]])
arabic -= lookup[roman[i]];
else arabic += lookup[roman[i]];
}
return arabic;
}
function toRoman(num) {
let lookup = {
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
},
roman = '',
i;
for (i in lookup) {
while (num >= lookup[i]) {
roman += i;
num -= lookup[i];
}
}
return roman;
}
function calculator(string) {
let nums = getNums(string);
if (nums.length != 2) throw new Error();
let operator = getOperator(string);
let result;
if (Number(nums[0]) && Number(nums[1])) {
result = Math.floor(calc(nums, operator));
} else
if (!Number(nums[0]) && !Number(nums[1])) {
let arabicNums = [toArabic(nums[0]), toArabic(nums[1])];
result = toRoman(Number(calc(arabicNums, operator)));
} else {
throw new Error();
}
return (String(result));
}
Ответы (1 шт):
Автор решения: azlov
→ Ссылка
Код не нигде не изменен. Что я смог увидеть сразу, так это в функции function toArabic(roman) {} в первом случае:
if (lookup[roman[i]] < lookup[roman[i + 1]]) // сравнение с каждым i-тым
во втором:
if (lookup[roman[1]] < lookup[roman[i + 1]]) // сравнение с первым