From 864ddd4549c3fbe3b22931961ddae68c1bb49240 Mon Sep 17 00:00:00 2001 From: Rohit Tanwar Date: Mon, 1 Jan 2018 20:51:01 +0530 Subject: [PATCH 1/8] add RPN solver --- snippets/RPNSolver.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 snippets/RPNSolver.md diff --git a/snippets/RPNSolver.md b/snippets/RPNSolver.md new file mode 100644 index 000000000..e21f42e13 --- /dev/null +++ b/snippets/RPNSolver.md @@ -0,0 +1,24 @@ +### RPNSolver + +Solves the given reverse polish notation +```js +const RPNSolver = RPN => { + const isNumeric = str => !isNaN(parseFloat(str)) && isFinite(str); + const isOperator = str => ['*','-','+','/','**'].includes(str) + let stack = []; + let solve = RPN.replace(/\^/g,'**').split(/\s+/g); + solve.forEach(symbol => { + isNumeric(symbol) ? stack.push(symbol) : + isOperator(symbol) ? + (a = stack.pop(), + b = stack.pop(), + stack.push(eval(a + symbol + b))) : Console.log('Wrong RPN') + } +) +return stack.pop() +} +``` + +```js + +``` From ff9a4ff546fedd56824cf84be937df770e14ecd6 Mon Sep 17 00:00:00 2001 From: Rohit Tanwar Date: Mon, 1 Jan 2018 20:59:54 +0530 Subject: [PATCH 2/8] update RPN solver --- snippets/RPNSolver.md | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/snippets/RPNSolver.md b/snippets/RPNSolver.md index e21f42e13..1b46dcb9a 100644 --- a/snippets/RPNSolver.md +++ b/snippets/RPNSolver.md @@ -8,14 +8,25 @@ const RPNSolver = RPN => { let stack = []; let solve = RPN.replace(/\^/g,'**').split(/\s+/g); solve.forEach(symbol => { - isNumeric(symbol) ? stack.push(symbol) : - isOperator(symbol) ? - (a = stack.pop(), - b = stack.pop(), - stack.push(eval(a + symbol + b))) : Console.log('Wrong RPN') + if(isNumeric(symbol)) {stack.push(symbol)} + else if (isOperator(symbol)){ + a = stack.pop(); + b = stack.pop(); + if(symbol === "+") { + stack.push(parseFloat(a) + parseFloat(b)); + } else if(symbol === "-") { + stack.push(parseFloat(b) - parseFloat(a)); + } else if(symbol === "*") { + stack.push(parseFloat(a) * parseFloat(b)); + } else if(symbol === "/") { + stack.push(parseFloat(b) / parseFloat(a)); + } else if(symbol === "**") { + stack.push(parseFloat(a) ** parseFloat(b)); + } + } else { console.log('Wrong RPN')} } ) -return stack.pop() +return stack.length === 1 ? stack.pop : console.log("error") } ``` From 9dce2b33b508a8deb6a436e5935c73be4fffbe8a Mon Sep 17 00:00:00 2001 From: Rohit Tanwar <31792358+kriadmin@users.noreply.github.com> Date: Mon, 1 Jan 2018 21:09:58 +0530 Subject: [PATCH 3/8] Update RPNSolver.md --- snippets/RPNSolver.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snippets/RPNSolver.md b/snippets/RPNSolver.md index 1b46dcb9a..beb9989f6 100644 --- a/snippets/RPNSolver.md +++ b/snippets/RPNSolver.md @@ -26,7 +26,7 @@ const RPNSolver = RPN => { } else { console.log('Wrong RPN')} } ) -return stack.length === 1 ? stack.pop : console.log("error") +return stack.length === 1 ? stack.pop() : console.log("error") } ``` From 3742dff530fab80ab3ad96035838b0c72125869b Mon Sep 17 00:00:00 2001 From: Rohit Tanwar Date: Mon, 1 Jan 2018 22:00:12 +0530 Subject: [PATCH 4/8] update RPN solver --- snippets/RPNSolver.md | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/snippets/RPNSolver.md b/snippets/RPNSolver.md index 1b46dcb9a..2cfb59be5 100644 --- a/snippets/RPNSolver.md +++ b/snippets/RPNSolver.md @@ -1,32 +1,21 @@ ### RPNSolver Solves the given reverse polish notation -```js + +``` js const RPNSolver = RPN => { - const isNumeric = str => !isNaN(parseFloat(str)) && isFinite(str); - const isOperator = str => ['*','-','+','/','**'].includes(str) - let stack = []; - let solve = RPN.replace(/\^/g,'**').split(/\s+/g); + const operators = {'*' : (a,b) => a * b, '+' : (a,b) => a + b, '-' : (a,b) => a - b, '/' : (a,b) => a / b, '**': (a,b) => a ** b} + let [stack,solve] = [[],RPN.replace(/\^/g,'**').split(/\s+/g).filter(el => !/\s+/.test(el) && el !== '')] solve.forEach(symbol => { - if(isNumeric(symbol)) {stack.push(symbol)} - else if (isOperator(symbol)){ - a = stack.pop(); - b = stack.pop(); - if(symbol === "+") { - stack.push(parseFloat(a) + parseFloat(b)); - } else if(symbol === "-") { - stack.push(parseFloat(b) - parseFloat(a)); - } else if(symbol === "*") { - stack.push(parseFloat(a) * parseFloat(b)); - } else if(symbol === "/") { - stack.push(parseFloat(b) / parseFloat(a)); - } else if(symbol === "**") { - stack.push(parseFloat(a) ** parseFloat(b)); - } - } else { console.log('Wrong RPN')} + if(!isNaN(parseFloat(symbol)) && isFinite(symbol)) {stack.push(symbol)} + else if (Object.keys(operators).includes(symbol)) { + let [a,b] = [stack.pop(),stack.pop()] + stack.push(operators[symbol](parseFloat(b),parseFloat(a))) + } else { throw `${symbol} is not a recognized symbol` } } ) -return stack.length === 1 ? stack.pop : console.log("error") + if(stack.length === 1) return stack.pop() + else throw `${RPN} is not a proper RPN. Please check it and try again` } ``` From b208a3c10a681d5b0ee4cfea32f7b9a00d6d19f7 Mon Sep 17 00:00:00 2001 From: Rohit Tanwar <31792358+kriadmin@users.noreply.github.com> Date: Mon, 1 Jan 2018 22:10:17 +0530 Subject: [PATCH 5/8] Update RPNSolver.md --- snippets/RPNSolver.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/snippets/RPNSolver.md b/snippets/RPNSolver.md index 2cfb59be5..042c4194c 100644 --- a/snippets/RPNSolver.md +++ b/snippets/RPNSolver.md @@ -4,13 +4,13 @@ Solves the given reverse polish notation ``` js const RPNSolver = RPN => { - const operators = {'*' : (a,b) => a * b, '+' : (a,b) => a + b, '-' : (a,b) => a - b, '/' : (a,b) => a / b, '**': (a,b) => a ** b} - let [stack,solve] = [[],RPN.replace(/\^/g,'**').split(/\s+/g).filter(el => !/\s+/.test(el) && el !== '')] + const OPERATORS = {'*' : (a,b) => a * b, '+' : (a,b) => a + b, '-' : (a,b) => a - b, '/' : (a,b) => a / b, '**': (a,b) => a ** b} + const [stack,solve] = [[],RPN.replace(/\^/g,'**').split(/\s+/g).filter(el => !/\s+/.test(el) && el !== '')] solve.forEach(symbol => { if(!isNaN(parseFloat(symbol)) && isFinite(symbol)) {stack.push(symbol)} - else if (Object.keys(operators).includes(symbol)) { - let [a,b] = [stack.pop(),stack.pop()] - stack.push(operators[symbol](parseFloat(b),parseFloat(a))) + else if (Object.keys(OPERATORS).includes(symbol)) { + const [a,b] = [stack.pop(),stack.pop()] + stack.push(OPERATORS[symbol](parseFloat(b),parseFloat(a))) } else { throw `${symbol} is not a recognized symbol` } } ) From c70eb7cdb848631ac14b2acc7f3a2b4e907f39bc Mon Sep 17 00:00:00 2001 From: Rohit Tanwar <31792358+kriadmin@users.noreply.github.com> Date: Mon, 1 Jan 2018 22:23:12 +0530 Subject: [PATCH 6/8] Add examples --- snippets/RPNSolver.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/snippets/RPNSolver.md b/snippets/RPNSolver.md index 042c4194c..3a5db36c3 100644 --- a/snippets/RPNSolver.md +++ b/snippets/RPNSolver.md @@ -20,5 +20,7 @@ const RPNSolver = RPN => { ``` ```js - +RPNSolver('15 7 1 1 + - / 3 * 2 1 1 + + -'); // 5 +RPNSolver('3 5 6 + *'); //33 +RPNSolver('2 4 / 5 6 - *'); //-0.5 ``` From cac5c2e49da9ddd9e0c51d5a7f332b7b3d6a9167 Mon Sep 17 00:00:00 2001 From: Rohit Tanwar <31792358+kriadmin@users.noreply.github.com> Date: Mon, 1 Jan 2018 22:24:39 +0530 Subject: [PATCH 7/8] Update RPNSolver.md --- snippets/RPNSolver.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/snippets/RPNSolver.md b/snippets/RPNSolver.md index 3a5db36c3..4796d27cb 100644 --- a/snippets/RPNSolver.md +++ b/snippets/RPNSolver.md @@ -23,4 +23,6 @@ const RPNSolver = RPN => { RPNSolver('15 7 1 1 + - / 3 * 2 1 1 + + -'); // 5 RPNSolver('3 5 6 + *'); //33 RPNSolver('2 4 / 5 6 - *'); //-0.5 +RPNSolver('2 3 ^'); //8 +RPNSolver('2 3 ^'); //8 ``` From 7bc8b8d0a28a74c4961ff9134ff02247abd37389 Mon Sep 17 00:00:00 2001 From: Angelos Chalaris Date: Mon, 1 Jan 2018 19:03:47 +0200 Subject: [PATCH 8/8] Update and rename RPNSolver.md to solveRPN.md --- snippets/RPNSolver.md | 28 ---------------------------- snippets/solveRPN.md | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 28 deletions(-) delete mode 100644 snippets/RPNSolver.md create mode 100644 snippets/solveRPN.md diff --git a/snippets/RPNSolver.md b/snippets/RPNSolver.md deleted file mode 100644 index 4796d27cb..000000000 --- a/snippets/RPNSolver.md +++ /dev/null @@ -1,28 +0,0 @@ -### RPNSolver - -Solves the given reverse polish notation - -``` js -const RPNSolver = RPN => { - const OPERATORS = {'*' : (a,b) => a * b, '+' : (a,b) => a + b, '-' : (a,b) => a - b, '/' : (a,b) => a / b, '**': (a,b) => a ** b} - const [stack,solve] = [[],RPN.replace(/\^/g,'**').split(/\s+/g).filter(el => !/\s+/.test(el) && el !== '')] - solve.forEach(symbol => { - if(!isNaN(parseFloat(symbol)) && isFinite(symbol)) {stack.push(symbol)} - else if (Object.keys(OPERATORS).includes(symbol)) { - const [a,b] = [stack.pop(),stack.pop()] - stack.push(OPERATORS[symbol](parseFloat(b),parseFloat(a))) - } else { throw `${symbol} is not a recognized symbol` } - } -) - if(stack.length === 1) return stack.pop() - else throw `${RPN} is not a proper RPN. Please check it and try again` -} -``` - -```js -RPNSolver('15 7 1 1 + - / 3 * 2 1 1 + + -'); // 5 -RPNSolver('3 5 6 + *'); //33 -RPNSolver('2 4 / 5 6 - *'); //-0.5 -RPNSolver('2 3 ^'); //8 -RPNSolver('2 3 ^'); //8 -``` diff --git a/snippets/solveRPN.md b/snippets/solveRPN.md new file mode 100644 index 000000000..059c0ac36 --- /dev/null +++ b/snippets/solveRPN.md @@ -0,0 +1,34 @@ +### solveRPN + +Solves the given mathematical expression in [reverse polish notation](https://en.wikipedia.org/wiki/Reverse_Polish_notation). +Throws appropriate errors if there are unrecognized symbols or the expression is wrong. + +Use a dictionary, `OPERATORS` to specify each operator's matching mathematical operation. +Use `String.replace()` with a regular expression to replace `^` with `**`, `String.split()` to tokenize the string and `Array.filter()` to remove empty tokens. +Use `Array.forEach()` to parse each `symbol`, evaluate it as a numeric value or operator and solve the mathematical expression. +Numeric values are converted to floating point numbers and pushed to a `stack`, while operators are evaluated using the `OPERATORS` dictionary and pop elements from the `stack` to apply operations. + +``` js +const solveRPN = rpn => { + const OPERATORS = {'*' : (a,b) => a * b, '+' : (a,b) => a + b, '-' : (a,b) => a - b, '/' : (a,b) => a / b, '**': (a,b) => a ** b}; + const [stack,solve] = [[],rpn.replace(/\^/g,'**').split(/\s+/g).filter(el => !/\s+/.test(el) && el !== '')]; + solve.forEach(symbol => { + if(!isNaN(parseFloat(symbol)) && isFinite(symbol)) {stack.push(symbol)} + else if (Object.keys(OPERATORS).includes(symbol)) { + const [a,b] = [stack.pop(),stack.pop()]; + stack.push(OPERATORS[symbol](parseFloat(b),parseFloat(a))) + } else { throw `${symbol} is not a recognized symbol` } + } +) + if(stack.length === 1) return stack.pop() + else throw `${rpn} is not a proper RPN. Please check it and try again` +} +``` + +```js +solveRPN('15 7 1 1 + - / 3 * 2 1 1 + + -'); // 5 +solveRPN('3 5 6 + *'); //33 +solveRPN('2 4 / 5 6 - *'); //-0.5 +solveRPN('2 3 ^'); //8 +solveRPN('2 3 ^'); //8 +```