Travis build: 807 [ci skip]
This commit is contained in:
63
README.md
63
README.md
@ -276,6 +276,15 @@
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
### _Uncategorized_
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>View contents</summary>
|
||||||
|
|
||||||
|
* [`solveRPN`](#solverpn)
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
---
|
---
|
||||||
## 🔌 Adapter
|
## 🔌 Adapter
|
||||||
|
|
||||||
@ -4848,6 +4857,60 @@ yesNo('Foo', true); // true
|
|||||||
|
|
||||||
<br>[⬆ Back to top](#table-of-contents)
|
<br>[⬆ Back to top](#table-of-contents)
|
||||||
|
|
||||||
|
---
|
||||||
|
## _Uncategorized_
|
||||||
|
|
||||||
|
### 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
|
||||||
|
```
|
||||||
|
|
||||||
|
<br>[⬆ back to top](#table-of-contents)
|
||||||
|
|
||||||
|
|
||||||
## Collaborators
|
## Collaborators
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@ -8,21 +8,35 @@ Use `String.replace()` with a regular expression to replace `^` with `**`, `Stri
|
|||||||
Use `Array.forEach()` to parse each `symbol`, evaluate it as a numeric value or operator and solve the mathematical expression.
|
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.
|
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
|
```js
|
||||||
const solveRPN = rpn => {
|
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 OPERATORS = {
|
||||||
const [stack,solve] = [[],rpn.replace(/\^/g,'**').split(/\s+/g).filter(el => !/\s+/.test(el) && el !== '')];
|
'*': (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 => {
|
solve.forEach(symbol => {
|
||||||
if(!isNaN(parseFloat(symbol)) && isFinite(symbol)) {stack.push(symbol)}
|
if (!isNaN(parseFloat(symbol)) && isFinite(symbol)) {
|
||||||
else if (Object.keys(OPERATORS).includes(symbol)) {
|
stack.push(symbol);
|
||||||
const [a,b] = [stack.pop(),stack.pop()];
|
} else if (Object.keys(OPERATORS).includes(symbol)) {
|
||||||
stack.push(OPERATORS[symbol](parseFloat(b),parseFloat(a)))
|
const [a, b] = [stack.pop(), stack.pop()];
|
||||||
} else { throw `${symbol} is not a recognized symbol` }
|
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`
|
});
|
||||||
}
|
if (stack.length === 1) return stack.pop();
|
||||||
|
else throw `${rpn} is not a proper RPN. Please check it and try again`;
|
||||||
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
```js
|
```js
|
||||||
|
|||||||
@ -137,6 +137,7 @@ shuffle:array
|
|||||||
similarity:array
|
similarity:array
|
||||||
size:object
|
size:object
|
||||||
sleep:function
|
sleep:function
|
||||||
|
solveRPN:uncategorized
|
||||||
sortCharactersInString:string
|
sortCharactersInString:string
|
||||||
sortedIndex:array
|
sortedIndex:array
|
||||||
speechSynthesis:browser
|
speechSynthesis:browser
|
||||||
|
|||||||
Reference in New Issue
Block a user