Skip to content

Instantly share code, notes, and snippets.

@inovramadani
Last active March 10, 2024 08:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save inovramadani/8bf5bd6abd0d3a9e0c67618a9a248cce to your computer and use it in GitHub Desktop.
Save inovramadani/8bf5bd6abd0d3a9e0c67618a9a248cce to your computer and use it in GitHub Desktop.
calculator.js
/* 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