math-exercises 2.0.7 → 2.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/lib/exercises/complex/argumentFromAlgebraicComplex.d.ts +6 -0
  2. package/lib/exercises/complex/argumentFromAlgebraicComplex.d.ts.map +1 -1
  3. package/lib/exercises/complex/argumentFromAlgebraicComplex.js +62 -51
  4. package/lib/exercises/complex/index.d.ts +1 -0
  5. package/lib/exercises/complex/index.d.ts.map +1 -1
  6. package/lib/exercises/complex/index.js +1 -0
  7. package/lib/exercises/functions/exponential/expEquation.d.ts +1 -0
  8. package/lib/exercises/functions/exponential/expEquation.d.ts.map +1 -1
  9. package/lib/exercises/functions/logarithm/index.d.ts +1 -0
  10. package/lib/exercises/functions/logarithm/index.d.ts.map +1 -1
  11. package/lib/exercises/functions/logarithm/index.js +1 -1
  12. package/lib/exercises/functions/logarithm/log10PowerSimplifying.d.ts.map +1 -1
  13. package/lib/exercises/functions/logarithm/log10PowerSimplifying.js +3 -2
  14. package/lib/exercises/functions/logarithm/logPowerEquation.d.ts +7 -1
  15. package/lib/exercises/functions/logarithm/logPowerEquation.d.ts.map +1 -1
  16. package/lib/exercises/functions/logarithm/logPowerEquation.js +47 -17
  17. package/lib/exercises/trigonometry/associatePoint.d.ts +7 -0
  18. package/lib/exercises/trigonometry/associatePoint.d.ts.map +1 -0
  19. package/lib/exercises/trigonometry/associatePoint.js +64 -0
  20. package/lib/exercises/trigonometry/index.d.ts +1 -0
  21. package/lib/exercises/trigonometry/index.d.ts.map +1 -1
  22. package/lib/exercises/trigonometry/index.js +1 -0
  23. package/lib/exercises/trigonometry/remarkableValues.d.ts +1 -1
  24. package/lib/exercises/trigonometry/remarkableValues.d.ts.map +1 -1
  25. package/lib/exercises/trigonometry/remarkableValues.js +9 -7
  26. package/lib/index.d.ts +13 -3
  27. package/lib/index.d.ts.map +1 -1
  28. package/lib/math/numbers/nombre.js +1 -1
  29. package/lib/math/numbers/reals/extendedRingElement.d.ts +2 -1
  30. package/lib/math/numbers/reals/extendedRingElement.d.ts.map +1 -1
  31. package/lib/math/polynomials/trinom.d.ts +2 -2
  32. package/lib/math/trigonometry/remarkableValue.d.ts +3 -10
  33. package/lib/math/trigonometry/remarkableValue.d.ts.map +1 -1
  34. package/lib/math/trigonometry/remarkableValue.js +5 -15
  35. package/lib/math/trigonometry/remarkableValues.d.ts +7 -1
  36. package/lib/math/trigonometry/remarkableValues.d.ts.map +1 -1
  37. package/lib/math/trigonometry/remarkableValues.js +63 -13
  38. package/lib/math/utils/arithmetic/gcd.js +1 -1
  39. package/lib/server.js +1 -7
  40. package/lib/tree/nodes/algebraicNode.d.ts +3 -0
  41. package/lib/tree/nodes/algebraicNode.d.ts.map +1 -1
  42. package/lib/tree/nodes/functions/absNode.d.ts +3 -1
  43. package/lib/tree/nodes/functions/absNode.d.ts.map +1 -1
  44. package/lib/tree/nodes/functions/absNode.js +5 -1
  45. package/lib/tree/nodes/functions/cosNode.d.ts +3 -1
  46. package/lib/tree/nodes/functions/cosNode.d.ts.map +1 -1
  47. package/lib/tree/nodes/functions/cosNode.js +21 -0
  48. package/lib/tree/nodes/functions/expNode.d.ts +3 -1
  49. package/lib/tree/nodes/functions/expNode.d.ts.map +1 -1
  50. package/lib/tree/nodes/functions/expNode.js +4 -0
  51. package/lib/tree/nodes/functions/log10Node.d.ts +3 -1
  52. package/lib/tree/nodes/functions/log10Node.d.ts.map +1 -1
  53. package/lib/tree/nodes/functions/log10Node.js +28 -0
  54. package/lib/tree/nodes/functions/logNode.d.ts +3 -1
  55. package/lib/tree/nodes/functions/logNode.d.ts.map +1 -1
  56. package/lib/tree/nodes/functions/logNode.js +32 -0
  57. package/lib/tree/nodes/functions/oppositeNode.d.ts +3 -0
  58. package/lib/tree/nodes/functions/oppositeNode.d.ts.map +1 -1
  59. package/lib/tree/nodes/functions/oppositeNode.js +7 -0
  60. package/lib/tree/nodes/functions/sinNode.d.ts +3 -1
  61. package/lib/tree/nodes/functions/sinNode.d.ts.map +1 -1
  62. package/lib/tree/nodes/functions/sinNode.js +21 -0
  63. package/lib/tree/nodes/functions/sqrtNode.d.ts +3 -0
  64. package/lib/tree/nodes/functions/sqrtNode.d.ts.map +1 -1
  65. package/lib/tree/nodes/functions/sqrtNode.js +41 -0
  66. package/lib/tree/nodes/geometry/lengthNode.d.ts +5 -1
  67. package/lib/tree/nodes/geometry/lengthNode.d.ts.map +1 -1
  68. package/lib/tree/nodes/geometry/lengthNode.js +12 -1
  69. package/lib/tree/nodes/node.d.ts +1 -0
  70. package/lib/tree/nodes/node.d.ts.map +1 -1
  71. package/lib/tree/nodes/node.js +14 -1
  72. package/lib/tree/nodes/numbers/constantNode.d.ts +3 -0
  73. package/lib/tree/nodes/numbers/constantNode.d.ts.map +1 -1
  74. package/lib/tree/nodes/numbers/constantNode.js +7 -0
  75. package/lib/tree/nodes/numbers/numberNode.d.ts +3 -0
  76. package/lib/tree/nodes/numbers/numberNode.d.ts.map +1 -1
  77. package/lib/tree/nodes/numbers/numberNode.js +7 -0
  78. package/lib/tree/nodes/operators/addNode.d.ts +3 -0
  79. package/lib/tree/nodes/operators/addNode.d.ts.map +1 -1
  80. package/lib/tree/nodes/operators/addNode.js +173 -0
  81. package/lib/tree/nodes/operators/divideNode.d.ts +3 -0
  82. package/lib/tree/nodes/operators/divideNode.d.ts.map +1 -1
  83. package/lib/tree/nodes/operators/divideNode.js +12 -0
  84. package/lib/tree/nodes/operators/fractionNode.d.ts +3 -0
  85. package/lib/tree/nodes/operators/fractionNode.d.ts.map +1 -1
  86. package/lib/tree/nodes/operators/fractionNode.js +86 -0
  87. package/lib/tree/nodes/operators/multiplyNode.d.ts +5 -0
  88. package/lib/tree/nodes/operators/multiplyNode.d.ts.map +1 -1
  89. package/lib/tree/nodes/operators/multiplyNode.js +127 -10
  90. package/lib/tree/nodes/operators/powerNode.d.ts +3 -0
  91. package/lib/tree/nodes/operators/powerNode.d.ts.map +1 -1
  92. package/lib/tree/nodes/operators/powerNode.js +46 -0
  93. package/lib/tree/nodes/operators/substractNode.d.ts +3 -0
  94. package/lib/tree/nodes/operators/substractNode.d.ts.map +1 -1
  95. package/lib/tree/nodes/operators/substractNode.js +12 -0
  96. package/lib/tree/nodes/variables/variableNode.d.ts +3 -0
  97. package/lib/tree/nodes/variables/variableNode.d.ts.map +1 -1
  98. package/lib/tree/nodes/variables/variableNode.js +10 -0
  99. package/package.json +1 -1
@@ -7,6 +7,9 @@ const operatorNode_1 = require("./operatorNode");
7
7
  const numberNode_1 = require("../numbers/numberNode");
8
8
  const round_1 = require("../../../math/utils/round");
9
9
  const oppositeNode_1 = require("../functions/oppositeNode");
10
+ const multiplyNode_1 = require("./multiplyNode");
11
+ const rational_1 = require("../../../math/numbers/rationals/rational");
12
+ const operatorComposition_1 = require("../../../tree/utilities/operatorComposition");
10
13
  function isFractionNode(a) {
11
14
  return (0, operatorNode_1.isOperatorNode)(a) && a.id === operatorNode_1.OperatorIds.fraction;
12
15
  }
@@ -18,6 +21,7 @@ class FractionNode {
18
21
  this.rightChild = rightChild;
19
22
  this.type = node_1.NodeType.operator;
20
23
  this.opts = opts;
24
+ this.isNumeric = leftChild.isNumeric && rightChild.isNumeric;
21
25
  }
22
26
  toMathString() {
23
27
  return `(${this.leftChild.toMathString()}) / (${this.rightChild.toMathString()})`;
@@ -66,5 +70,87 @@ class FractionNode {
66
70
  evaluate(vars) {
67
71
  return this.leftChild.evaluate(vars) / this.rightChild.evaluate(vars);
68
72
  }
73
+ // toMathjs() {
74
+ // return fraction(this.leftChild.toMathjs(), this.rightChild.toMathjs());
75
+ // }
76
+ simplify() {
77
+ const simplifiedNum = this.leftChild.simplify();
78
+ const simplifiedDenum = this.rightChild.simplify();
79
+ const copy = new FractionNode(simplifiedNum, simplifiedDenum, this.opts);
80
+ const externalsNums = [];
81
+ const externalsDenums = [];
82
+ const recursiveNums = (node) => {
83
+ if ((0, multiplyNode_1.isMultiplyNode)(node)) {
84
+ recursiveNums(node.leftChild);
85
+ recursiveNums(node.rightChild);
86
+ }
87
+ else {
88
+ externalsNums.push(node);
89
+ }
90
+ };
91
+ const recursiveDenums = (node) => {
92
+ if ((0, multiplyNode_1.isMultiplyNode)(node)) {
93
+ recursiveDenums(node.leftChild);
94
+ recursiveDenums(node.rightChild);
95
+ }
96
+ else {
97
+ externalsDenums.push(node);
98
+ }
99
+ };
100
+ recursiveNums(copy.leftChild);
101
+ recursiveDenums(copy.rightChild);
102
+ const simplifyExternalNodes = (num, denum) => {
103
+ if ((0, numberNode_1.isNumberNode)(num) && (0, numberNode_1.isNumberNode)(denum)) {
104
+ const frac = new rational_1.Rational(num.value, denum.value);
105
+ console.log(frac.isIrreductible());
106
+ if (frac.isIrreductible())
107
+ return null;
108
+ return frac.simplify().toTree();
109
+ }
110
+ //!ya mieux à faire pour gérer tous les cas d'un coup
111
+ //! s'insiprer de multiply
112
+ if (num.equals(denum))
113
+ return new numberNode_1.NumberNode(1);
114
+ return null;
115
+ };
116
+ console.log(externalsNums, externalsDenums);
117
+ const simplifyIteration = () => {
118
+ for (let i = 0; i < externalsNums.length; i++) {
119
+ const num = externalsNums[i];
120
+ for (let j = 0; j < externalsDenums.length; j++) {
121
+ const denum = externalsDenums[j];
122
+ const simplified = simplifyExternalNodes(num, denum);
123
+ if (simplified) {
124
+ if (isFractionNode(simplified)) {
125
+ externalsNums[i] = simplified.leftChild;
126
+ externalsDenums[j] = simplified.rightChild;
127
+ }
128
+ else {
129
+ externalsNums[i] = simplified;
130
+ externalsDenums.splice(j, 1);
131
+ }
132
+ simplifyIteration();
133
+ return;
134
+ }
135
+ }
136
+ }
137
+ };
138
+ simplifyIteration();
139
+ const nums = externalsNums.length === 1
140
+ ? externalsNums[0]
141
+ : (0, operatorComposition_1.operatorComposition)(multiplyNode_1.MultiplyNode, externalsNums).simplify();
142
+ if (externalsDenums.length === 0) {
143
+ return nums;
144
+ }
145
+ const denums = externalsDenums.length === 1
146
+ ? externalsDenums[0]
147
+ : (0, operatorComposition_1.operatorComposition)(multiplyNode_1.MultiplyNode, externalsDenums);
148
+ return new FractionNode(nums, denums);
149
+ }
150
+ equals(node) {
151
+ return (isFractionNode(node) &&
152
+ node.leftChild.equals(this.leftChild) &&
153
+ node.rightChild.equals(this.rightChild));
154
+ }
69
155
  }
70
156
  exports.FractionNode = FractionNode;
@@ -2,12 +2,14 @@ import { Node, NodeOptions, NodeType } from "../node";
2
2
  import { CommutativeOperatorNode, OperatorIds } from "./operatorNode";
3
3
  import { AlgebraicNode } from "../algebraicNode";
4
4
  export declare function isMultiplyNode(a: Node): a is MultiplyNode;
5
+ export declare const sortMultiplyNodes: (arr: AlgebraicNode[]) => void;
5
6
  export declare class MultiplyNode implements CommutativeOperatorNode {
6
7
  opts?: NodeOptions;
7
8
  id: OperatorIds;
8
9
  leftChild: AlgebraicNode;
9
10
  rightChild: AlgebraicNode;
10
11
  type: NodeType;
12
+ isNumeric: boolean;
11
13
  constructor(leftChild: AlgebraicNode, rightChild: AlgebraicNode, opts?: NodeOptions);
12
14
  shuffle: () => void;
13
15
  toMathString(): string;
@@ -16,5 +18,8 @@ export declare class MultiplyNode implements CommutativeOperatorNode {
16
18
  toEquivalentNodes(opts?: NodeOptions): MultiplyNode[];
17
19
  toAllValidTexs(opts?: NodeOptions): string[];
18
20
  evaluate(vars: Record<string, number>): number;
21
+ copy(): MultiplyNode;
22
+ simplify(): AlgebraicNode;
23
+ equals(node: AlgebraicNode): boolean;
19
24
  }
20
25
  //# sourceMappingURL=multiplyNode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"multiplyNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/operators/multiplyNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EACL,uBAAuB,EACvB,WAAW,EAEZ,MAAM,gBAAgB,CAAC;AAYxB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,YAAY,CAEzD;AACD,qBAAa,YAAa,YAAW,uBAAuB;IAC1D,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,aAAa,CAAC;IAC1B,IAAI,EAAE,QAAQ,CAAC;gBAEb,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,aAAa,EACzB,IAAI,CAAC,EAAE,WAAW;IAkBpB,OAAO,aAGL;IAEF,YAAY,IAAI,MAAM;IAItB,KAAK,IAAI,MAAM;IAkDf,SAAS;IAkDT,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,YAAY,EAAE;IAwFrD,cAAc,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE;IAQ5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAGtC"}
1
+ {"version":3,"file":"multiplyNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/operators/multiplyNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EACL,uBAAuB,EACvB,WAAW,EAEZ,MAAM,gBAAgB,CAAC;AAYxB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKjD,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,YAAY,CAEzD;AAED,eAAO,MAAM,iBAAiB,QAAS,aAAa,EAAE,SAWrD,CAAC;AACF,qBAAa,YAAa,YAAW,uBAAuB;IAC1D,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,aAAa,CAAC;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;gBAEjB,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,aAAa,EACzB,IAAI,CAAC,EAAE,WAAW;IAUpB,OAAO,aAGL;IAEF,YAAY,IAAI,MAAM;IAItB,KAAK,IAAI,MAAM;IAkDf,SAAS;IAkDT,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,YAAY,EAAE;IAwFrD,cAAc,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE;IAQ5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAIrC,IAAI;IAGJ,QAAQ,IAAI,aAAa;IAqGzB,MAAM,CAAC,IAAI,EAAE,aAAa;CAU3B"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MultiplyNode = exports.isMultiplyNode = void 0;
3
+ exports.MultiplyNode = exports.sortMultiplyNodes = exports.isMultiplyNode = void 0;
4
4
  // import { multiply } from "mathjs";
5
5
  const node_1 = require("../node");
6
6
  const operatorNode_1 = require("./operatorNode");
@@ -12,30 +12,37 @@ const powerNode_1 = require("./powerNode");
12
12
  const numberNode_1 = require("../numbers/numberNode");
13
13
  const isInt_1 = require("../../../utils/isInt");
14
14
  const variableNode_1 = require("../variables/variableNode");
15
+ const sqrtNode_1 = require("../functions/sqrtNode");
16
+ const oppositeNode_1 = require("../functions/oppositeNode");
17
+ const fractionNode_1 = require("./fractionNode");
18
+ const functionNode_1 = require("../functions/functionNode");
15
19
  function isMultiplyNode(a) {
16
20
  return (0, operatorNode_1.isOperatorNode)(a) && a.id === operatorNode_1.OperatorIds.multiply;
17
21
  }
18
22
  exports.isMultiplyNode = isMultiplyNode;
23
+ const sortMultiplyNodes = (arr) => {
24
+ arr.sort((a, b) => {
25
+ return (Number(b.isNumeric) - Number(a.isNumeric) ||
26
+ Number((0, numberNode_1.isNumberNode)(b) && b.value === -1) -
27
+ Number((0, numberNode_1.isNumberNode)(a) && a.value === -1) ||
28
+ Number((0, numberNode_1.isNumberNode)(b)) - Number((0, numberNode_1.isNumberNode)(a)) ||
29
+ Number((0, functionNode_1.isFunctionNode)(b)) - Number((0, functionNode_1.isFunctionNode)(a)) ||
30
+ Number((0, operatorNode_1.isOperatorNode)(b)) - Number((0, operatorNode_1.isOperatorNode)(a)));
31
+ });
32
+ };
33
+ exports.sortMultiplyNodes = sortMultiplyNodes;
19
34
  class MultiplyNode {
20
35
  constructor(leftChild, rightChild, opts) {
21
36
  this.shuffle = () => {
22
37
  if ((0, coinFlip_1.coinFlip)())
23
38
  [this.leftChild, this.rightChild] = [this.rightChild, this.leftChild];
24
39
  };
25
- // let [left, right] = [leftChild, rightChild];
26
- // const shouldSwitch =
27
- // (rightChild.type === NodeType.function &&
28
- // (rightChild as FunctionNode).id === FunctionsIds.opposite) ||
29
- // (leftChild.type === NodeType.constant &&
30
- // rightChild.type === NodeType.number);
31
- // if (shouldSwitch) {
32
- // [left, right] = [rightChild, leftChild];
33
- // }
34
40
  this.id = operatorNode_1.OperatorIds.multiply;
35
41
  this.leftChild = leftChild;
36
42
  this.rightChild = rightChild;
37
43
  this.type = node_1.NodeType.operator;
38
44
  this.opts = opts;
45
+ this.isNumeric = leftChild.isNumeric && rightChild.isNumeric;
39
46
  }
40
47
  toMathString() {
41
48
  return `(${this.leftChild.toMathString()})*(${this.rightChild.toMathString()})`;
@@ -191,5 +198,115 @@ class MultiplyNode {
191
198
  evaluate(vars) {
192
199
  return this.leftChild.evaluate(vars) * this.rightChild.evaluate(vars);
193
200
  }
201
+ copy() {
202
+ return new MultiplyNode(this.leftChild, this.rightChild, this.opts);
203
+ }
204
+ simplify() {
205
+ const leftSimplified = this.leftChild.simplify();
206
+ const rightSimplified = this.rightChild.simplify();
207
+ const copy = new MultiplyNode(leftSimplified, rightSimplified, this.opts);
208
+ /**get externals nodes
209
+ * les opposites sont supprimés et on ajoute *-1 à la fin si leur nb est impair
210
+ */
211
+ let externals = [];
212
+ let oppositesCount = 0;
213
+ //TODO Fractions
214
+ const recursive = (node) => {
215
+ if (isMultiplyNode(node)) {
216
+ recursive(node.leftChild);
217
+ recursive(node.rightChild);
218
+ }
219
+ else if ((0, oppositeNode_1.isOppositeNode)(node)) {
220
+ oppositesCount++;
221
+ recursive(node.child);
222
+ }
223
+ else {
224
+ externals.push(node);
225
+ }
226
+ };
227
+ recursive(copy);
228
+ //si 0 on s'arrete
229
+ if (externals.some((node) => (0, numberNode_1.isNumberNode)(node) && node.value === 0)) {
230
+ return new numberNode_1.NumberNode(0);
231
+ }
232
+ if (oppositesCount % 2 === 1) {
233
+ externals.unshift(new numberNode_1.NumberNode(-1));
234
+ }
235
+ //suppression des 1
236
+ externals = externals.filter((node) => !(0, numberNode_1.isNumberNode)(node) || node.value !== 1);
237
+ if (!externals.length)
238
+ return new numberNode_1.NumberNode(1);
239
+ if (externals.length === 1)
240
+ return externals[0];
241
+ //s'il y a une fraction on transforme en fracNode
242
+ if (externals.some((node) => (0, fractionNode_1.isFractionNode)(node))) {
243
+ const nums = [];
244
+ const denums = [];
245
+ externals.forEach((node) => {
246
+ if ((0, fractionNode_1.isFractionNode)(node)) {
247
+ nums.push(node.leftChild);
248
+ denums.push(node.rightChild);
249
+ }
250
+ else
251
+ nums.push(node);
252
+ });
253
+ if (nums.some((node) => (0, numberNode_1.isNumberNode)(node) && node.value === 0)) {
254
+ return new numberNode_1.NumberNode(0);
255
+ }
256
+ (0, exports.sortMultiplyNodes)(nums);
257
+ (0, exports.sortMultiplyNodes)(denums);
258
+ const numNode = (0, operatorComposition_1.operatorComposition)(MultiplyNode, nums);
259
+ const denumNode = denums.length === 1
260
+ ? denums[0]
261
+ : (0, operatorComposition_1.operatorComposition)(MultiplyNode, denums);
262
+ return new fractionNode_1.FractionNode(numNode, denumNode).simplify();
263
+ }
264
+ (0, exports.sortMultiplyNodes)(externals);
265
+ console.log(externals.map((n) => n.toTex()));
266
+ const simplifyExternalNodes = (a, b) => {
267
+ if ((0, numberNode_1.isNumberNode)(a) && (0, numberNode_1.isNumberNode)(b)) {
268
+ return new numberNode_1.NumberNode(a.value * b.value);
269
+ }
270
+ if ((0, sqrtNode_1.isSqrtNode)(a) && (0, sqrtNode_1.isSqrtNode)(b)) {
271
+ return new sqrtNode_1.SqrtNode(new MultiplyNode(a.child, b.child)).simplify();
272
+ }
273
+ //TODo continue
274
+ return null;
275
+ };
276
+ //pour chaque paire on essaye de simplifier,
277
+ //chaque simplification déclenche le reboot du process
278
+ const simplifyIteration = () => {
279
+ for (let i = 0; i < externals.length - 1; i++) {
280
+ const left = externals[i];
281
+ for (let j = i + 1; j < externals.length; j++) {
282
+ const right = externals[j];
283
+ const simplified = simplifyExternalNodes(left, right);
284
+ if (simplified) {
285
+ externals[i] = simplified;
286
+ externals.splice(j, 1);
287
+ if ((0, numberNode_1.isNumberNode)(simplified) && simplified.value === 1) {
288
+ externals.splice(i, 1);
289
+ }
290
+ simplifyIteration();
291
+ return;
292
+ }
293
+ }
294
+ }
295
+ };
296
+ simplifyIteration();
297
+ if (!externals.length)
298
+ return new numberNode_1.NumberNode(1);
299
+ if (externals.length === 1)
300
+ return externals[0];
301
+ return (0, operatorComposition_1.operatorComposition)(MultiplyNode, externals);
302
+ }
303
+ equals(node) {
304
+ //!incorrect, il faut plutot vérifier qu'ils ont les meme externals
305
+ return (isMultiplyNode(node) &&
306
+ ((node.leftChild.equals(this.leftChild) &&
307
+ node.rightChild.equals(this.rightChild)) ||
308
+ (node.leftChild.equals(this.rightChild) &&
309
+ node.rightChild.equals(this.leftChild))));
310
+ }
194
311
  }
195
312
  exports.MultiplyNode = MultiplyNode;
@@ -8,12 +8,15 @@ export declare class PowerNode implements OperatorNode {
8
8
  leftChild: AlgebraicNode;
9
9
  rightChild: AlgebraicNode;
10
10
  type: NodeType;
11
+ isNumeric: boolean;
11
12
  constructor(leftChild: AlgebraicNode, rightChild: AlgebraicNode, opts?: NodeOptions);
12
13
  toMathString(): string;
13
14
  toEquivalentNodes(): AlgebraicNode[];
14
15
  toAllValidTexs(): string[];
15
16
  toTex(): string;
16
17
  evaluate(vars: Record<string, number>): number;
18
+ simplify(): this;
19
+ equals(node: AlgebraicNode): boolean;
17
20
  }
18
21
  export declare class SquareNode extends PowerNode {
19
22
  constructor(child: AlgebraicNode, opts?: NodeOptions);
@@ -1 +1 @@
1
- {"version":3,"file":"powerNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/operators/powerNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAG3E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKjD,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,SAAS,CAEnD;AAED,qBAAa,SAAU,YAAW,YAAY;IAC5C,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,aAAa,CAAC;IAC1B,IAAI,EAAE,QAAQ,CAAC;gBAEb,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,aAAa,EACzB,IAAI,CAAC,EAAE,WAAW;IASpB,YAAY,IAAI,MAAM;IAItB,iBAAiB;IAqBjB,cAAc,IAAI,MAAM,EAAE;IAI1B,KAAK,IAAI,MAAM;IAuBf,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CA4CtC;AAED,qBAAa,UAAW,SAAQ,SAAS;gBAC3B,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,WAAW;CAGrD"}
1
+ {"version":3,"file":"powerNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/operators/powerNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAG3E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKjD,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,SAAS,CAEnD;AAED,qBAAa,SAAU,YAAW,YAAY;IAC5C,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,aAAa,CAAC;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;gBAEjB,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,aAAa,EACzB,IAAI,CAAC,EAAE,WAAW;IAUpB,YAAY,IAAI,MAAM;IAItB,iBAAiB;IAqBjB,cAAc,IAAI,MAAM,EAAE;IAI1B,KAAK,IAAI,MAAM;IAuBf,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IA6CrC,QAAQ;IAGR,MAAM,CAAC,IAAI,EAAE,aAAa;CAO3B;AAED,qBAAa,UAAW,SAAQ,SAAS;gBAC3B,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,WAAW;CAGrD"}
@@ -17,6 +17,7 @@ class PowerNode {
17
17
  this.rightChild = rightChild;
18
18
  this.type = node_1.NodeType.operator;
19
19
  this.opts = opts;
20
+ this.isNumeric = leftChild.isNumeric && rightChild.isNumeric;
20
21
  }
21
22
  toMathString() {
22
23
  return `(${this.leftChild.toMathString()})^(${this.rightChild.toMathString()})`;
@@ -73,6 +74,51 @@ class PowerNode {
73
74
  evaluate(vars) {
74
75
  return Math.pow(this.leftChild.evaluate(vars), this.rightChild.evaluate(vars));
75
76
  }
77
+ // simplify(): AlgebraicNode {
78
+ // const leftSimplified = this.leftChild.simplify();
79
+ // const rightSimplified = this.rightChild.simplify();
80
+ // if (isNumberNode(rightSimplified)) {
81
+ // const value = rightSimplified.value;
82
+ // if (value === 0) return new NumberNode(1);
83
+ // if (value === 1) return leftSimplified;
84
+ // }
85
+ // if (isNumberNode(leftSimplified)) {
86
+ // const value = leftSimplified.value;
87
+ // if (value === 0) return leftSimplified;
88
+ // if (value === 1) return leftSimplified;
89
+ // }
90
+ // if (isNumberNode(rightSimplified) && isNumberNode(leftSimplified)) {
91
+ // const value = this.evaluate({});
92
+ // // à partir de ^21 et de ^-7, javascript returns des écritures scientifiques
93
+ // if (
94
+ // Math.abs(value) < Math.pow(10, 21) ||
95
+ // Math.abs(value) < Math.pow(10, -7)
96
+ // ) {
97
+ // return new NumberNode(value);
98
+ // } else return this;
99
+ // }
100
+ // if (isExpNode(leftSimplified) && isLogNode(rightSimplified)) {
101
+ // return rightSimplified.child;
102
+ // }
103
+ // if (isPowerNode(leftSimplified)) {
104
+ // return new PowerNode(
105
+ // leftSimplified.leftChild,
106
+ // new MultiplyNode(leftSimplified.rightChild, rightSimplified),
107
+ // ).simplify();
108
+ // }
109
+ // if (isSqrtNode(leftSimplified) && isNumberNode(rightSimplified)) {
110
+ // }
111
+ // //! simplifications possibles :
112
+ // // puissances négatives ?
113
+ // }
114
+ simplify() {
115
+ return this;
116
+ }
117
+ equals(node) {
118
+ return (isPowerNode(node) &&
119
+ node.leftChild.equals(this.leftChild) &&
120
+ node.rightChild.equals(this.rightChild));
121
+ }
76
122
  }
77
123
  exports.PowerNode = PowerNode;
78
124
  class SquareNode extends PowerNode {
@@ -7,11 +7,14 @@ export declare class SubstractNode implements OperatorNode {
7
7
  leftChild: AlgebraicNode;
8
8
  rightChild: AlgebraicNode;
9
9
  type: NodeType;
10
+ isNumeric: boolean;
10
11
  constructor(leftChild: AlgebraicNode, rightChild: AlgebraicNode);
11
12
  toMathString(): string;
12
13
  toEquivalentNodes(): AlgebraicNode[];
13
14
  toAllValidTexs(): string[];
14
15
  toTex(): string;
15
16
  evaluate(vars: Record<string, number>): number;
17
+ simplify(): this;
18
+ equals(node: AlgebraicNode): boolean;
16
19
  }
17
20
  //# sourceMappingURL=substractNode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"substractNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/operators/substractNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAG3E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,wBAAgB,eAAe,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,aAAa,CAE3D;AACD,qBAAa,aAAc,YAAW,YAAY;IAChD,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,aAAa,CAAC;IAC1B,IAAI,EAAE,QAAQ,CAAC;gBACH,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa;IAO/D,YAAY,IAAI,MAAM;IAItB,iBAAiB,IAAI,aAAa,EAAE;IAapC,cAAc,IAAI,MAAM,EAAE;IAG1B,KAAK,IAAI,MAAM;IAef,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAMtC"}
1
+ {"version":3,"file":"substractNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/operators/substractNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAG3E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,wBAAgB,eAAe,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,aAAa,CAE3D;AACD,qBAAa,aAAc,YAAW,YAAY;IAChD,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,aAAa,CAAC;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;gBACP,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa;IAQ/D,YAAY,IAAI,MAAM;IAItB,iBAAiB,IAAI,aAAa,EAAE;IAapC,cAAc,IAAI,MAAM,EAAE;IAG1B,KAAK,IAAI,MAAM;IAef,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAMrC,QAAQ;IAGR,MAAM,CAAC,IAAI,EAAE,aAAa;CAO3B"}
@@ -16,6 +16,7 @@ class SubstractNode {
16
16
  this.leftChild = leftChild;
17
17
  this.rightChild = rightChild;
18
18
  this.type = node_1.NodeType.operator;
19
+ this.isNumeric = leftChild.isNumeric && rightChild.isNumeric;
19
20
  }
20
21
  toMathString() {
21
22
  return `${this.leftChild.toMathString()}-(${this.rightChild.toMathString()})`;
@@ -48,5 +49,16 @@ class SubstractNode {
48
49
  evaluate(vars) {
49
50
  return this.leftChild.evaluate(vars) - this.rightChild.evaluate(vars);
50
51
  }
52
+ // toMathjs() {
53
+ // return subtract(this.leftChild.toMathjs(), this.rightChild.toMathjs());
54
+ // }
55
+ simplify() {
56
+ return this;
57
+ }
58
+ equals(node) {
59
+ return (isSubstractNode(node) &&
60
+ node.leftChild.equals(this.leftChild) &&
61
+ node.rightChild.equals(this.rightChild));
62
+ }
51
63
  }
52
64
  exports.SubstractNode = SubstractNode;
@@ -4,6 +4,7 @@ export declare function isVariableNode(a: Node): a is VariableNode;
4
4
  export declare class VariableNode implements AlgebraicNode {
5
5
  name: string;
6
6
  type: NodeType;
7
+ isNumeric: boolean;
7
8
  constructor(name: string);
8
9
  toTex(): string;
9
10
  toMathString(): string;
@@ -11,5 +12,7 @@ export declare class VariableNode implements AlgebraicNode {
11
12
  toAllValidTexs(): string[];
12
13
  toEquivalentNodes(): this[];
13
14
  evaluate(vars: Record<string, number>): number;
15
+ simplify(): this;
16
+ equals(node: AlgebraicNode): boolean;
14
17
  }
15
18
  //# sourceMappingURL=variableNode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"variableNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/variables/variableNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEzC,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,YAAY,CAEzD;AACD,qBAAa,YAAa,YAAW,aAAa;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,WAAqB;gBAEb,IAAI,EAAE,MAAM;IAIxB,KAAK,IAAI,MAAM;IAGf,YAAY,IAAI,MAAM;IAGtB,QAAQ;IAGR,cAAc;IAGd,iBAAiB;IAIjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAStC"}
1
+ {"version":3,"file":"variableNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/variables/variableNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEzC,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,YAAY,CAEzD;AACD,qBAAa,YAAa,YAAW,aAAa;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,WAAqB;IACzB,SAAS,EAAE,OAAO,CAAC;gBACP,IAAI,EAAE,MAAM;IAKxB,KAAK,IAAI,MAAM;IAGf,YAAY,IAAI,MAAM;IAGtB,QAAQ;IAGR,cAAc;IAGd,iBAAiB;IAIjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IASrC,QAAQ;IAGR,MAAM,CAAC,IAAI,EAAE,aAAa;CAG3B"}
@@ -10,6 +10,7 @@ class VariableNode {
10
10
  constructor(name) {
11
11
  this.type = node_1.NodeType.variable;
12
12
  this.name = name;
13
+ this.isNumeric = false;
13
14
  }
14
15
  toTex() {
15
16
  return `${this.name}`;
@@ -32,5 +33,14 @@ class VariableNode {
32
33
  throw Error(`Can't evaluate variable ${this.name}`);
33
34
  return value;
34
35
  }
36
+ // simplify(): Node {
37
+ // return this;
38
+ // }
39
+ simplify() {
40
+ return this;
41
+ }
42
+ equals(node) {
43
+ return isVariableNode(node) && node.name === this.name;
44
+ }
35
45
  }
36
46
  exports.VariableNode = VariableNode;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "math-exercises",
3
- "version": "2.0.7",
3
+ "version": "2.0.9",
4
4
  "description": "Math exercises generator for middle school and high school",
5
5
  "main": "lib/index.js",
6
6
  "files": [