Last active
March 10, 2024 08:14
-
-
Save inovramadani/8bf5bd6abd0d3a9e0c67618a9a248cce to your computer and use it in GitHub Desktop.
calculator.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* input is string (with spaces) as below expressions. | |
operator precedes numbers | |
"+ 4 5" --> result: 9, | |
"+ + 3 4 7" --> 14, | |
"- 3 * 4 5" --> -17, | |
"* 3 + 4 5" --> 27, | |
"* + 3 4 5" --> 35, | |
"+ - 3 4 7" --> 6, | |
"+ - * 3 2 4 5" --> 7, | |
"+ 24 * - 2 1 1" --> 25 | |
*/ | |
function calculate (expression) { | |
return calc(expression.split(" ")) | |
} | |
function calc (expression) { | |
const current = expression[0] | |
const left = expression.slice(1, -1) | |
const leftVal = left[0] | |
const right = expression.slice(2) | |
const rightVal = expression[expression.length - 1] | |
if (expression.length === 1 && RegExp(/\d/).test(expression)) { | |
return Number(current) | |
} | |
switch (current) { | |
case '+': | |
return RegExp(/\d/).test(leftVal) | |
? (Number(leftVal) + (expression.length === 3 ? Number(rightVal) : calc(right))) | |
: (calc(left) + Number(rightVal)) | |
case '-': | |
return RegExp(/\d/).test(leftVal) | |
? (Number(leftVal) - (expression.length === 3 ? Number(rightVal) : calc(right))) | |
: (calc(left) - Number(rightVal)) | |
case '*': | |
return RegExp(/\d/).test(leftVal) | |
? (Number(leftVal) * (expression.length === 3 ? Number(rightVal) : calc(right))) | |
: (calc(left) * Number(rightVal)) | |
case '/': | |
return RegExp(/\d/).test(leftVal) | |
? (Number(leftVal) / (expression.length === 3 ? Number(rightVal) : calc(right))) | |
: (calc(left) / Number(rightVal)) | |
default: | |
console.log('nothing got into the default case') | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment