Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- "use strict";
- const cnst = (x) => () => x;
- const pi = cnst(Math.PI);
- const e = cnst(Math.E);
- const variable = (name) => (x, y, z) => {
- if (name === "x") return x;
- if (name === "y") return y;
- if (name === "z") return z;
- }
- const add = (a, b) => (...args) => a(...args) + b(...args);
- const subtract = (a, b) => (...args) => a(...args) - b(...args);
- const multiply = (a, b) => (...args) => a(...args) * b(...args);
- const divide = (a, b) => (...args) => a(...args) / b(...args);
- const negate = (a) => (...args) => (-1) * a(...args);
- const avg5 = (a, b, c, d, e) => (...args) => {
- return (a(...args) + b(...args) + c(...args) + d(...args) + e(...args)) / 5;
- }
- const med3 = (a, b, c) => (...args) => {
- let arr = [a(...args), b(...args), c(...args)];
- arr = arr.sort((a, b) => a - b);
- return arr[1];
- }
- const operations = [ 'negate', '+', '-', '*', '/', 'med3', 'avg5' ];
- const operationToArity = {
- 'negate': 1,
- '+' : 2,
- '-' : 2,
- '*' : 2,
- '/' : 2,
- 'med3' : 3,
- 'avg5' : 5
- };
- const operationToFunction = {
- 'negate': negate,
- '+' : add,
- '-' : subtract,
- '*' : multiply,
- '/' : divide,
- 'med3' : med3,
- 'avg5' : avg5
- };
- const parse = function(expression) {
- let stack = [];
- let tokens = expression.split(' ').filter((word) => word !== '');
- for (let token of tokens) {
- let arity = token in operationToArity ? operationToArity[token] : 0;
- let args = [];
- for (let i = 0; i < arity; i++) {
- args.push(stack.pop());
- }
- args = args.reverse();
- stack.push(makeOperation(token, ...args));
- }
- return stack.pop();
- }
- const makeOperation = function (token, ...args) {
- switch (token) {
- case 'negate': return negate(...args);
- case "+": return add(...args);
- case "-": return subtract(...args);
- case "*": return multiply(...args);
- case "/": return divide(...args);
- case 'med3': return med3(...args);
- case 'avg5': return avg5(...args);
- case "x": return variable("x");
- case "y": return variable("y");
- case "z": return variable("z");
- case 'pi': return pi;
- case 'e': return e;
- }
- return cnst(Number.parseInt(token));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement