Skip to content

Instantly share code, notes, and snippets.

@nfroidure
Last active July 11, 2016 13:07
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 nfroidure/9a10d910d82ac51c78407cd60db9998a to your computer and use it in GitHub Desktop.
Save nfroidure/9a10d910d82ac51c78407cd60db9998a to your computer and use it in GitHub Desktop.
Simple calculator
var operators = {
'+': (a, b) => a + b,
'-': (a, b) => a - b,
'*': (a, b) => a * b,
'/': (a, b) => a / b,
};
function calculator (str) {
return str.split(/\s*(\+|-)\s*/g)
.map(substr => {
parts = substr.split(/\s*(\/|\*)\s*/g);
return 1 === parts.length ?
parts[0] :
parts
.map(cleanup)
.reduce(compute);
})
.map(cleanup)
.reduce(compute);
}
function cleanup (substr, i) {
if(0 === i % 2)
return parseInt(substr, 10);
return substr;
}
function compute (result, part, i, parts) {
if(0 === i)
return part;
if(i % 2)
return operators[part](result, parts[i + 1]);
return result;
}
calculator('1 + 1 - 4 * 6') // -22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment