simplify init
This commit is contained in:
parent
6e79cb1e83
commit
743220aa1d
2
dist/helpers.js
vendored
2
dist/helpers.js
vendored
@ -152,6 +152,6 @@ var flatten = (function (_flatten) {
|
|||||||
|
|
||||||
exports.flatten = flatten;
|
exports.flatten = flatten;
|
||||||
var removeSymbols = function removeSymbols(string) {
|
var removeSymbols = function removeSymbols(string) {
|
||||||
return string.replace(/\W/g, '');
|
return string.toString().replace(/\W/g, '');
|
||||||
};
|
};
|
||||||
exports.removeSymbols = removeSymbols;
|
exports.removeSymbols = removeSymbols;
|
34
dist/index.js
vendored
34
dist/index.js
vendored
@ -53,6 +53,7 @@ var Equation = {
|
|||||||
|
|
||||||
return stack;
|
return stack;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an equation function which replaces variables
|
* Creates an equation function which replaces variables
|
||||||
* in the given expression with the values specified in order,
|
* in the given expression with the values specified in order,
|
||||||
@ -72,8 +73,7 @@ var Equation = {
|
|||||||
var variables = [];
|
var variables = [];
|
||||||
|
|
||||||
stack.forEach(function (a) {
|
stack.forEach(function (a) {
|
||||||
if (typeof a === 'string' && !_.isNumber(a) && !_operators2['default'][a] && a === a.toLowerCase()) {
|
if (isVariable(a)) {
|
||||||
// grouped variables like (y) need to have their parantheses removed
|
|
||||||
variables.push(_.removeSymbols(a));
|
variables.push(_.removeSymbols(a));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -95,6 +95,31 @@ var Equation = {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simplifies a math expression
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* 2*x^2 + x - 2*x - x^2
|
||||||
|
* becomes
|
||||||
|
* x^2 - x
|
||||||
|
*
|
||||||
|
* @param {String} expression
|
||||||
|
* The expression to create an equation for (containing variables)
|
||||||
|
* @return {String}
|
||||||
|
* The simplified expression
|
||||||
|
*/
|
||||||
|
simplify: function simplify(expression) {
|
||||||
|
var stack = parseExpression(expression);
|
||||||
|
stack = sortStack(stack);
|
||||||
|
stack = _.parseNumbers(stack);
|
||||||
|
|
||||||
|
console.dir(stack, {
|
||||||
|
depth: null
|
||||||
|
});
|
||||||
|
|
||||||
|
return expression;
|
||||||
|
},
|
||||||
|
|
||||||
registerOperator: function registerOperator(key, options) {
|
registerOperator: function registerOperator(key, options) {
|
||||||
_operators2['default'][key] = options;
|
_operators2['default'][key] = options;
|
||||||
},
|
},
|
||||||
@ -177,6 +202,11 @@ var parseExpression = function parseExpression(expression) {
|
|||||||
return parseGroups(stack);
|
return parseGroups(stack);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var isVariable = function isVariable(char) {
|
||||||
|
var ch = _.removeSymbols(char);
|
||||||
|
return typeof ch === 'string' && !_.isNumber(ch) && !_operators2['default'][ch] && char === ch.toLowerCase();
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Takes the parsed array from parseExpression and
|
* Takes the parsed array from parseExpression and
|
||||||
* groups up expressions in parantheses in deep arrays
|
* groups up expressions in parantheses in deep arrays
|
||||||
|
73
dist/tests/basic.js
vendored
73
dist/tests/basic.js
vendored
@ -1,73 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; };
|
|
||||||
|
|
||||||
var _expect = require('chai');
|
|
||||||
|
|
||||||
var _M = require('../index.js');
|
|
||||||
|
|
||||||
var _M2 = _interopRequireWildcard(_M);
|
|
||||||
|
|
||||||
describe('Basic math operators', function () {
|
|
||||||
it('should work for add +', function () {
|
|
||||||
_expect.expect(_M2['default'].solve('2+2')).to.equal(4);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should work for minus -', function () {
|
|
||||||
_expect.expect(_M2['default'].solve('15-3')).to.equal(12);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should work for divison /', function () {
|
|
||||||
_expect.expect(_M2['default'].solve('20/2')).to.equal(10);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should work for multiplication *', function () {
|
|
||||||
_expect.expect(_M2['default'].solve('6*3')).to.equal(18);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should work for power ^', function () {
|
|
||||||
_expect.expect(_M2['default'].solve('5^2')).to.equal(25);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should work for multi-digit numbers', function () {
|
|
||||||
_expect.expect(_M2['default'].solve('12+15')).to.equal(27);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Precedence', function () {
|
|
||||||
it('Test case 1', function () {
|
|
||||||
_expect.expect(_M2['default'].solve('2+(2+1)*(1+1)^2')).to.equal(14);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Test case 2', function () {
|
|
||||||
_expect.expect(_M2['default'].solve('2+5*4/2-2')).to.equal(10);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Test case 3', function () {
|
|
||||||
_expect.expect(_M2['default'].solve('2+(5*4/2)-2')).to.equal(10);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Test case 4', function () {
|
|
||||||
_expect.expect(_M2['default'].solve('(2+2)^2+(5+1)*4+(2+(4/2)/2)')).to.equal(16 + 24 + 3);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Functions', function () {
|
|
||||||
it('should work for with parantheses', function () {
|
|
||||||
_expect.expect(_M2['default'].solve('lg(4) * 5')).to.equal(10);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should work for without parantheses', function () {
|
|
||||||
_expect.expect(_M2['default'].solve('lg4 * 5')).to.equal(10);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Constats', function () {
|
|
||||||
it('should work for constant values', function () {
|
|
||||||
_expect.expect(_M2['default'].solve('sin(PI/2)')).to.equal(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should work for functions as constants', function () {
|
|
||||||
_expect.expect(_M2['default'].solve('RAND')).to.not.equal(_M2['default'].solve('RAND'));
|
|
||||||
});
|
|
||||||
});
|
|
35
dist/tests/simplify.js
vendored
Normal file
35
dist/tests/simplify.js
vendored
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; };
|
||||||
|
|
||||||
|
var _expect = require('chai');
|
||||||
|
|
||||||
|
var _M = require('../index.js');
|
||||||
|
|
||||||
|
var _M2 = _interopRequireWildcard(_M);
|
||||||
|
|
||||||
|
describe('Simplify simple math expressions', function () {
|
||||||
|
it('should work for add +', function () {
|
||||||
|
_expect.expect(_M2['default'].simplify('2+2-1')).to.equal('3');
|
||||||
|
});
|
||||||
|
//
|
||||||
|
// it('should work for minus -', () => {
|
||||||
|
// expect(M.solve('15-3')).to.equal(12);
|
||||||
|
// });
|
||||||
|
//
|
||||||
|
// it('should work for divison /', () => {
|
||||||
|
// expect(M.solve('20/2')).to.equal(10);
|
||||||
|
// });
|
||||||
|
//
|
||||||
|
// it('should work for multiplication *', () => {
|
||||||
|
// expect(M.solve('6*3')).to.equal(18);
|
||||||
|
// });
|
||||||
|
//
|
||||||
|
// it('should work for power ^', () => {
|
||||||
|
// expect(M.solve('5^2')).to.equal(25);
|
||||||
|
// });
|
||||||
|
//
|
||||||
|
// it('should work for multi-digit numbers', () => {
|
||||||
|
// expect(M.solve('12+15')).to.equal(27);
|
||||||
|
// });
|
||||||
|
});
|
@ -74,5 +74,5 @@ export const flatten = (arr) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const removeSymbols = string => {
|
export const removeSymbols = string => {
|
||||||
return string.replace(/\W/g, '');
|
return string.toString().replace(/\W/g, '');
|
||||||
};
|
};
|
||||||
|
36
lib/index.js
36
lib/index.js
@ -30,6 +30,7 @@ let Equation = {
|
|||||||
|
|
||||||
return stack;
|
return stack;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an equation function which replaces variables
|
* Creates an equation function which replaces variables
|
||||||
* in the given expression with the values specified in order,
|
* in the given expression with the values specified in order,
|
||||||
@ -49,9 +50,7 @@ let Equation = {
|
|||||||
let variables = [];
|
let variables = [];
|
||||||
|
|
||||||
stack.forEach(a => {
|
stack.forEach(a => {
|
||||||
if (typeof a === 'string' && !_.isNumber(a) &&
|
if (isVariable(a)) {
|
||||||
!operators[a] && a === a.toLowerCase()) {
|
|
||||||
// grouped variables like (y) need to have their parantheses removed
|
|
||||||
variables.push(_.removeSymbols(a));
|
variables.push(_.removeSymbols(a));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -69,6 +68,31 @@ let Equation = {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simplifies a math expression
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* 2*x^2 + x - 2*x - x^2
|
||||||
|
* becomes
|
||||||
|
* x^2 - x
|
||||||
|
*
|
||||||
|
* @param {String} expression
|
||||||
|
* The expression to create an equation for (containing variables)
|
||||||
|
* @return {String}
|
||||||
|
* The simplified expression
|
||||||
|
*/
|
||||||
|
simplify(expression) {
|
||||||
|
let stack = parseExpression(expression);
|
||||||
|
stack = sortStack(stack);
|
||||||
|
stack = _.parseNumbers(stack);
|
||||||
|
|
||||||
|
console.dir(stack, {
|
||||||
|
depth: null
|
||||||
|
});
|
||||||
|
|
||||||
|
return expression;
|
||||||
|
},
|
||||||
|
|
||||||
registerOperator(key, options) {
|
registerOperator(key, options) {
|
||||||
operators[key] = options;
|
operators[key] = options;
|
||||||
},
|
},
|
||||||
@ -142,6 +166,12 @@ const parseExpression = expression => {
|
|||||||
return parseGroups(stack);
|
return parseGroups(stack);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const isVariable = char => {
|
||||||
|
let ch = _.removeSymbols(char);
|
||||||
|
return typeof ch === 'string' && !_.isNumber(ch) &&
|
||||||
|
!operators[ch] && char === ch.toLowerCase();
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Takes the parsed array from parseExpression and
|
* Takes the parsed array from parseExpression and
|
||||||
* groups up expressions in parantheses in deep arrays
|
* groups up expressions in parantheses in deep arrays
|
||||||
|
28
tests/simplify.js
Normal file
28
tests/simplify.js
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
import {expect} from 'chai';
|
||||||
|
import M from '../index.js';
|
||||||
|
|
||||||
|
describe('Simplify simple math expressions', () => {
|
||||||
|
it('should work for add +', () => {
|
||||||
|
expect(M.simplify('2+2-1')).to.equal('3');
|
||||||
|
});
|
||||||
|
//
|
||||||
|
// it('should work for minus -', () => {
|
||||||
|
// expect(M.solve('15-3')).to.equal(12);
|
||||||
|
// });
|
||||||
|
//
|
||||||
|
// it('should work for divison /', () => {
|
||||||
|
// expect(M.solve('20/2')).to.equal(10);
|
||||||
|
// });
|
||||||
|
//
|
||||||
|
// it('should work for multiplication *', () => {
|
||||||
|
// expect(M.solve('6*3')).to.equal(18);
|
||||||
|
// });
|
||||||
|
//
|
||||||
|
// it('should work for power ^', () => {
|
||||||
|
// expect(M.solve('5^2')).to.equal(25);
|
||||||
|
// });
|
||||||
|
//
|
||||||
|
// it('should work for multi-digit numbers', () => {
|
||||||
|
// expect(M.solve('12+15')).to.equal(27);
|
||||||
|
// });
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user