math-exercises 3.0.199 → 3.0.200

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 (123) hide show
  1. package/lib/exercises/exercise.d.ts +14 -1
  2. package/lib/exercises/exercise.d.ts.map +1 -1
  3. package/lib/exercises/math/_debug/debugReorder1.d.ts +8 -0
  4. package/lib/exercises/math/_debug/debugReorder1.d.ts.map +1 -0
  5. package/lib/exercises/math/_debug/debugReorder1.js +81 -0
  6. package/lib/exercises/math/_debug/debugReorder2.d.ts +10 -0
  7. package/lib/exercises/math/_debug/debugReorder2.d.ts.map +1 -0
  8. package/lib/exercises/math/_debug/debugReorder2.js +88 -0
  9. package/lib/exercises/math/_debug/debugReorder3.d.ts +10 -0
  10. package/lib/exercises/math/_debug/debugReorder3.d.ts.map +1 -0
  11. package/lib/exercises/math/_debug/debugReorder3.js +81 -0
  12. package/lib/exercises/math/_debug/index.d.ts +3 -1
  13. package/lib/exercises/math/_debug/index.d.ts.map +1 -1
  14. package/lib/exercises/math/_debug/index.js +3 -1
  15. package/lib/exercises/math/calcul/factorial/index.d.ts +2 -0
  16. package/lib/exercises/math/calcul/factorial/index.d.ts.map +1 -0
  17. package/lib/exercises/math/calcul/factorial/index.js +1 -0
  18. package/lib/exercises/math/calcul/factorial/simplifyQuotientOfFactorialToProduct.d.ts +8 -0
  19. package/lib/exercises/math/calcul/factorial/simplifyQuotientOfFactorialToProduct.d.ts.map +1 -0
  20. package/lib/exercises/math/calcul/factorial/simplifyQuotientOfFactorialToProduct.js +199 -0
  21. package/lib/exercises/math/combinatory/combination/index.d.ts +3 -0
  22. package/lib/exercises/math/combinatory/combination/index.d.ts.map +1 -0
  23. package/lib/exercises/math/combinatory/combination/index.js +2 -0
  24. package/lib/exercises/math/combinatory/combination/mentalCalculateCombination.d.ts +11 -0
  25. package/lib/exercises/math/combinatory/combination/mentalCalculateCombination.d.ts.map +1 -0
  26. package/lib/exercises/math/combinatory/combination/mentalCalculateCombination.js +225 -0
  27. package/lib/exercises/math/combinatory/combination/writeCombinationFormulaUsingFactorial.d.ts +13 -0
  28. package/lib/exercises/math/combinatory/combination/writeCombinationFormulaUsingFactorial.d.ts.map +1 -0
  29. package/lib/exercises/math/combinatory/combination/writeCombinationFormulaUsingFactorial.js +285 -0
  30. package/lib/exercises/math/dataRepresentations/scatterPlot/scatterPlotInterpreting.d.ts.map +1 -1
  31. package/lib/exercises/math/dataRepresentations/scatterPlot/scatterPlotInterpreting.js +1 -1
  32. package/lib/exercises/math/derivation/derivative/trigo/productOfSinAXPlusBCosCXPlusDDerivative.d.ts +9 -0
  33. package/lib/exercises/math/derivation/derivative/trigo/productOfSinAXPlusBCosCXPlusDDerivative.d.ts.map +1 -0
  34. package/lib/exercises/math/derivation/derivative/trigo/productOfSinAXPlusBCosCXPlusDDerivative.js +209 -0
  35. package/lib/exercises/math/derivation/derivative/trigo/sinAndCosMixedWithSquareDerivative.d.ts +9 -0
  36. package/lib/exercises/math/derivation/derivative/trigo/sinAndCosMixedWithSquareDerivative.d.ts.map +1 -0
  37. package/lib/exercises/math/derivation/derivative/trigo/sinAndCosMixedWithSquareDerivative.js +359 -0
  38. package/lib/exercises/math/derivation/derivative/trigo/sinCosDerivativeRewriteUsingCos2PlusSin2Equals1.d.ts +11 -0
  39. package/lib/exercises/math/derivation/derivative/trigo/sinCosDerivativeRewriteUsingCos2PlusSin2Equals1.d.ts.map +1 -0
  40. package/lib/exercises/math/derivation/derivative/trigo/sinCosDerivativeRewriteUsingCos2PlusSin2Equals1.js +445 -0
  41. package/lib/exercises/math/functions/affines/affineVarTableOnBoundedInterval.d.ts.map +1 -1
  42. package/lib/exercises/math/functions/affines/affineVarTableOnBoundedInterval.js +2 -3
  43. package/lib/exercises/math/index.d.ts +1 -0
  44. package/lib/exercises/math/index.d.ts.map +1 -1
  45. package/lib/exercises/math/index.js +1 -1
  46. package/lib/exercises/math/limits/sequenceGeometricLimit.d.ts.map +1 -1
  47. package/lib/exercises/math/limits/sequenceGeometricLimit.js +9 -0
  48. package/lib/exercises/math/primitive/constantPrimitive.d.ts +8 -5
  49. package/lib/exercises/math/primitive/constantPrimitive.d.ts.map +1 -1
  50. package/lib/exercises/math/primitive/constantPrimitive.js +40 -21
  51. package/lib/exercises/math/probaStat/stats2var/averagePoint.d.ts.map +1 -1
  52. package/lib/exercises/math/probaStat/stats2var/averagePoint.js +34 -2
  53. package/lib/exercises/math/sequences/geometric/graph/geometricFindThresholdFromGraph.d.ts +15 -0
  54. package/lib/exercises/math/sequences/geometric/graph/geometricFindThresholdFromGraph.d.ts.map +1 -0
  55. package/lib/exercises/math/sequences/geometric/graph/geometricFindThresholdFromGraph.js +255 -0
  56. package/lib/exercises/math/sequences/geometric/graph/geometricFindThresholdUsingCalculator.d.ts +15 -0
  57. package/lib/exercises/math/sequences/geometric/graph/geometricFindThresholdUsingCalculator.d.ts.map +1 -0
  58. package/lib/exercises/math/sequences/geometric/graph/geometricFindThresholdUsingCalculator.js +242 -0
  59. package/lib/exercises/math/sequences/geometric/graph/geometricPlaceFirstPoints.js +4 -4
  60. package/lib/exercises/math/sequences/geometric/graph/geometricSignOfReasonFromGraph.d.ts +12 -0
  61. package/lib/exercises/math/sequences/geometric/graph/geometricSignOfReasonFromGraph.d.ts.map +1 -0
  62. package/lib/exercises/math/sequences/geometric/graph/geometricSignOfReasonFromGraph.js +161 -0
  63. package/lib/exercises/math/sets/cartesianProduct/findCardinalOfCartesianProductOfFiniteSets.d.ts +10 -0
  64. package/lib/exercises/math/sets/cartesianProduct/findCardinalOfCartesianProductOfFiniteSets.d.ts.map +1 -0
  65. package/lib/exercises/math/sets/cartesianProduct/findCardinalOfCartesianProductOfFiniteSets.js +224 -0
  66. package/lib/exercises/math/sets/cartesianProduct/findCardinalOfCartesianProductOfFiniteSetsFromSituation.d.ts +18 -0
  67. package/lib/exercises/math/sets/cartesianProduct/findCardinalOfCartesianProductOfFiniteSetsFromSituation.d.ts.map +1 -0
  68. package/lib/exercises/math/sets/cartesianProduct/findCardinalOfCartesianProductOfFiniteSetsFromSituation.js +198 -0
  69. package/lib/exercises/math/sets/cartesianProduct/findCardinalOfPowEK.d.ts +10 -0
  70. package/lib/exercises/math/sets/cartesianProduct/findCardinalOfPowEK.d.ts.map +1 -0
  71. package/lib/exercises/math/sets/cartesianProduct/findCardinalOfPowEK.js +231 -0
  72. package/lib/exercises/math/sets/cartesianProduct/findNumberOfPasswordsWithLettersAndNumbers.d.ts +19 -0
  73. package/lib/exercises/math/sets/cartesianProduct/findNumberOfPasswordsWithLettersAndNumbers.d.ts.map +1 -0
  74. package/lib/exercises/math/sets/cartesianProduct/findNumberOfPasswordsWithLettersAndNumbers.js +187 -0
  75. package/lib/exercises/math/sets/cartesianProduct/index.d.ts +7 -0
  76. package/lib/exercises/math/sets/cartesianProduct/index.d.ts.map +1 -0
  77. package/lib/exercises/math/sets/cartesianProduct/index.js +6 -0
  78. package/lib/exercises/math/sets/cartesianProduct/proposeElementInCartesianProductOfFiniteSets.d.ts +15 -0
  79. package/lib/exercises/math/sets/cartesianProduct/proposeElementInCartesianProductOfFiniteSets.d.ts.map +1 -0
  80. package/lib/exercises/math/sets/cartesianProduct/proposeElementInCartesianProductOfFiniteSets.js +291 -0
  81. package/lib/exercises/math/sets/cartesianProduct/proposeElementInPowEK.d.ts +15 -0
  82. package/lib/exercises/math/sets/cartesianProduct/proposeElementInPowEK.d.ts.map +1 -0
  83. package/lib/exercises/math/sets/cartesianProduct/proposeElementInPowEK.js +274 -0
  84. package/lib/exercises/math/sets/combinations/findNumberOfCombinationsFromSituation.d.ts +17 -0
  85. package/lib/exercises/math/sets/combinations/findNumberOfCombinationsFromSituation.d.ts.map +1 -0
  86. package/lib/exercises/math/sets/combinations/findNumberOfCombinationsFromSituation.js +228 -0
  87. package/lib/exercises/math/sets/combinations/findNumberOfProductsOfCombinationsFromSituation.d.ts +17 -0
  88. package/lib/exercises/math/sets/combinations/findNumberOfProductsOfCombinationsFromSituation.d.ts.map +1 -0
  89. package/lib/exercises/math/sets/combinations/findNumberOfProductsOfCombinationsFromSituation.js +388 -0
  90. package/lib/exercises/math/sets/combinations/index.d.ts +4 -0
  91. package/lib/exercises/math/sets/combinations/index.d.ts.map +1 -0
  92. package/lib/exercises/math/sets/combinations/index.js +3 -0
  93. package/lib/exercises/math/sets/combinations/proposeCombination.d.ts +15 -0
  94. package/lib/exercises/math/sets/combinations/proposeCombination.d.ts.map +1 -0
  95. package/lib/exercises/math/sets/combinations/proposeCombination.js +347 -0
  96. package/lib/exercises/math/sets/partialPermutations/findNumberOfPartialPermutationsFromSituation.d.ts +16 -0
  97. package/lib/exercises/math/sets/partialPermutations/findNumberOfPartialPermutationsFromSituation.d.ts.map +1 -0
  98. package/lib/exercises/math/sets/partialPermutations/findNumberOfPartialPermutationsFromSituation.js +186 -0
  99. package/lib/exercises/math/sets/partialPermutations/findNumberOfPermutationsFromSituation.d.ts +17 -0
  100. package/lib/exercises/math/sets/partialPermutations/findNumberOfPermutationsFromSituation.d.ts.map +1 -0
  101. package/lib/exercises/math/sets/partialPermutations/findNumberOfPermutationsFromSituation.js +232 -0
  102. package/lib/exercises/math/sets/partialPermutations/index.d.ts +4 -0
  103. package/lib/exercises/math/sets/partialPermutations/index.d.ts.map +1 -0
  104. package/lib/exercises/math/sets/partialPermutations/index.js +3 -0
  105. package/lib/exercises/math/sets/partialPermutations/proposePartialPermutation.d.ts +15 -0
  106. package/lib/exercises/math/sets/partialPermutations/proposePartialPermutation.d.ts.map +1 -0
  107. package/lib/exercises/math/sets/partialPermutations/proposePartialPermutation.js +343 -0
  108. package/lib/exercises/math/trigonometry/functions/parityOfCosAXTimesSinBX.d.ts +8 -0
  109. package/lib/exercises/math/trigonometry/functions/parityOfCosAXTimesSinBX.d.ts.map +1 -0
  110. package/lib/exercises/math/trigonometry/functions/parityOfCosAXTimesSinBX.js +193 -0
  111. package/lib/index.d.ts +15 -1
  112. package/lib/index.d.ts.map +1 -1
  113. package/lib/math/sets/setOperations.d.ts +9 -0
  114. package/lib/math/sets/setOperations.d.ts.map +1 -0
  115. package/lib/math/sets/setOperations.js +84 -0
  116. package/lib/math/sets/tuple.d.ts +12 -0
  117. package/lib/math/sets/tuple.d.ts.map +1 -0
  118. package/lib/math/sets/tuple.js +17 -0
  119. package/lib/server.js +25 -0
  120. package/lib/tree/utilities/nodePrinter.d.ts +7 -0
  121. package/lib/tree/utilities/nodePrinter.d.ts.map +1 -0
  122. package/lib/tree/utilities/nodePrinter.js +36 -0
  123. package/package.json +1 -1
@@ -0,0 +1,228 @@
1
+ import { addValidProp, shuffleProps, tryToAddWrongProp, } from "../../../../exercises/exercise.js";
2
+ import { getDistinctQuestions } from "../../../../exercises/utils/getDistinctQuestions.js";
3
+ import { NodeConstructor, } from "../../../../tree/nodes/nodeConstructor.js";
4
+ import { random } from "../../../../utils/alea/random.js";
5
+ import { randint } from "../../../../math/utils/random/randint.js";
6
+ import { frac, isFractionNode, } from "../../../../tree/nodes/operators/fractionNode.js";
7
+ import { facto } from "../../../../tree/nodes/functions/factorialNode.js";
8
+ import { binom, } from "../../../../tree/nodes/operators/binomialCoefficientNode.js";
9
+ import { power } from "../../../../tree/nodes/operators/powerNode.js";
10
+ import { handleVEAError } from "../../../../utils/errors/handleVEAError.js";
11
+ import { parseAlgebraic } from "../../../../tree/parsers/latexParser.js";
12
+ import { NodeComparator } from "../../../../tree/utilities/nodeComparator.js";
13
+ const situationTemplates = [
14
+ {
15
+ strInstruction: `Une boîte contient $\${total}$ perles toutes distinctes. Pour faire un bracelet, Jade commence par prendre en une seule fois une poignée de $\${picked}$ perles dans la boîte. Combien de poignées différentes existe-t-il ?`,
16
+ strHint: `Est-ce que l'ordre a de l'importance ici ? Comment appelle-t-on le sous-ensemble que Jade a prélevé ?`,
17
+ strCorrection: `Jade prend un ensemble de $\${picked}$ perles parmi $\${total}$.
18
+ Elle prend un sous-ensemble de perles : C'est une combinaison.
19
+ Le nombre de combinaisons possible est :
20
+
21
+ $$
22
+ \${cardinal}
23
+ $$
24
+
25
+ `,
26
+ dictFuncs: {
27
+ total: () => {
28
+ return {
29
+ value: randint(50, 101),
30
+ };
31
+ },
32
+ picked: () => {
33
+ return {
34
+ value: randint(12, 30),
35
+ };
36
+ },
37
+ },
38
+ },
39
+ {
40
+ strInstruction: `Marion pioche au hasard $\${picked}$ cartes dans un paquet d'un jeu de $\${total}$ cartes classique. Combien de mains différentes Marion peut-elle avoir ?`,
41
+ strHint: `Est-ce que l'ordre a de l'importance ici ? Comment appelle-t-on le sous-ensemble que Marion a pioché ?`,
42
+ strCorrection: `Marion prend un ensemble de $\${picked}$ cartes parmi $\${total}$.
43
+ Elle prend un sous-ensemble de cartes : C'est une combinaison.
44
+ Le nombre de combinaisons possible est :
45
+
46
+ $$
47
+ \${cardinal}
48
+ $$
49
+
50
+ `,
51
+ dictFuncs: {
52
+ total: () => {
53
+ return {
54
+ value: random([32, 52]),
55
+ };
56
+ },
57
+ picked: () => {
58
+ return {
59
+ value: randint(6, 10),
60
+ };
61
+ },
62
+ },
63
+ },
64
+ {
65
+ strInstruction: `Dans une course automobile, $\${total}$ équipages sont en lice. Les $\${picked}$ derniers n'iront pas en finale. Combien de groupes d'éliminés sont possibles ?`,
66
+ strHint: `Est-ce que l'ordre a de l'importance ici ? Comment appelle-t-on le sous-ensemble des éliminés ?`,
67
+ strCorrection: `Les éliminés sont un ensemble de $\${picked}$ participants parmi $\${total}$.
68
+ Les éliminés sont un sous-ensemble de l'ensemble des participants : C'est une combinaison.
69
+ Le nombre de combinaisons possible est :
70
+
71
+ $$
72
+ \${cardinal}
73
+ $$
74
+
75
+ `,
76
+ dictFuncs: {
77
+ total: () => {
78
+ return {
79
+ value: random([16, 33]),
80
+ };
81
+ },
82
+ picked: () => {
83
+ return {
84
+ value: randint(8, 11),
85
+ };
86
+ },
87
+ },
88
+ },
89
+ ];
90
+ class SituationConstructor {
91
+ static randomSituationFromTemplate(situationTemplate) {
92
+ const dictSets = Object.entries(situationTemplate.dictFuncs).reduce((acc, [key, func]) => {
93
+ acc[key] = func();
94
+ return acc;
95
+ }, {});
96
+ const { strInstruction, strCorrection: strCorrectionIncomplete } = Object.entries(dictSets).reduce((acc, [key, miniDict]) => {
97
+ acc.strInstruction = acc.strInstruction.replace(`\${${key}}`, `${miniDict.value}`);
98
+ acc.strCorrection = acc.strCorrection.replace(`\${${key}}`, `${miniDict.value}`);
99
+ return acc;
100
+ }, {
101
+ strInstruction: situationTemplate.strInstruction,
102
+ strCorrection: situationTemplate.strCorrection,
103
+ });
104
+ const { total: { value: valueTotal }, picked: { value: valuePicked }, } = dictSets;
105
+ const nodeCardinal = binom(valueTotal, valuePicked);
106
+ const strCorrection = strCorrectionIncomplete.replace(`\${cardinal}`, `${nodeCardinal.toTex()} = ${nodeCardinal
107
+ .toFormulaWithFactoFractionNode()
108
+ .toTex()}`);
109
+ return {
110
+ nodeIdsCardinal: nodeCardinal.toIdentifiers(),
111
+ strInstruction,
112
+ strHint: situationTemplate.strHint,
113
+ strCorrection,
114
+ dictSets,
115
+ };
116
+ }
117
+ }
118
+ const getInstruction = (identifiers) => {
119
+ const { situation: { strInstruction }, } = identifiers;
120
+ return strInstruction;
121
+ };
122
+ const getAnswerNode = (identifiers) => {
123
+ const { situation: { nodeIdsCardinal }, } = identifiers;
124
+ const nodeCardinal = NodeConstructor.fromIdentifiers(nodeIdsCardinal);
125
+ return nodeCardinal;
126
+ };
127
+ const getAnswer = (identifiers) => {
128
+ return getAnswerNode(identifiers).toTex();
129
+ };
130
+ const getHint = (identifiers) => {
131
+ const { situation: { strHint }, } = identifiers;
132
+ return `${strHint}`;
133
+ };
134
+ const getCorrection = (identifiers) => {
135
+ const { situation: { strCorrection }, } = identifiers;
136
+ return `${strCorrection}`;
137
+ };
138
+ const getPropositions = (n, { answer, ...identifiers }) => {
139
+ const { situation: { dictSets }, } = identifiers;
140
+ const propositions = [];
141
+ addValidProp(propositions, answer);
142
+ const { total: { value: valueTotal }, picked: { value: valuePicked }, } = dictSets;
143
+ //student: picked!
144
+ {
145
+ const nodeWrong = facto(valuePicked);
146
+ tryToAddWrongProp(propositions, nodeWrong.toTex());
147
+ }
148
+ //student: frac(total!, picked!)
149
+ {
150
+ const nodeWrong = frac(facto(valueTotal), facto(valuePicked));
151
+ tryToAddWrongProp(propositions, nodeWrong.toTex());
152
+ }
153
+ //student: power(total, picked)
154
+ {
155
+ const nodeWrong = power(valueTotal, valuePicked);
156
+ tryToAddWrongProp(propositions, nodeWrong.toTex());
157
+ }
158
+ return shuffleProps(propositions, n);
159
+ };
160
+ const getKeys = () => {
161
+ const keyFacto = {
162
+ id: "custom",
163
+ label: "!",
164
+ labelType: "tex",
165
+ mathfieldInstructions: {
166
+ method: "write",
167
+ content: "!",
168
+ },
169
+ };
170
+ return [
171
+ // "facto",
172
+ keyFacto,
173
+ "binom",
174
+ ];
175
+ };
176
+ const isAnswerValid = (ans, { answer }) => {
177
+ try {
178
+ const nodeAns = parseAlgebraic(ans);
179
+ const nodeAnswer = parseAlgebraic(answer);
180
+ if (isFractionNode(nodeAns)) {
181
+ //ans is probably formula with factorials
182
+ const nodeAnswerVer2 = nodeAnswer.toFormulaWithFactoFractionNode();
183
+ return NodeComparator.isEqualViaFrac(nodeAns, nodeAnswerVer2);
184
+ }
185
+ else {
186
+ //ans is probably formula with binom notation
187
+ return NodeComparator.isEqualViaSub(nodeAns, nodeAnswer);
188
+ }
189
+ }
190
+ catch (e) {
191
+ handleVEAError(e);
192
+ return false;
193
+ }
194
+ };
195
+ const getFindNumberOfCombinationsFromSituationQuestion = () => {
196
+ const situationTemplate = random(situationTemplates);
197
+ const situation = SituationConstructor.randomSituationFromTemplate(situationTemplate);
198
+ const identifiers = {
199
+ situation,
200
+ };
201
+ return getQuestionFromIdentifiers(identifiers);
202
+ };
203
+ const getQuestionFromIdentifiers = (identifiers) => {
204
+ const question = {
205
+ instruction: getInstruction(identifiers),
206
+ answer: getAnswer(identifiers),
207
+ keys: getKeys(identifiers),
208
+ answerFormat: "tex",
209
+ identifiers,
210
+ hint: getHint(identifiers),
211
+ correction: getCorrection(identifiers),
212
+ };
213
+ return question;
214
+ };
215
+ export const findNumberOfCombinationsFromSituation = {
216
+ id: "findNumberOfCombinationsFromSituation",
217
+ connector: "=",
218
+ isSingleStep: true,
219
+ label: "Déterminer le nombre de combinaisons à partir d'une situation",
220
+ generator: (nb) => getDistinctQuestions(getFindNumberOfCombinationsFromSituationQuestion, nb),
221
+ qcmTimer: 60,
222
+ freeTimer: 60,
223
+ getPropositions,
224
+ isAnswerValid,
225
+ subject: "Mathématiques",
226
+ hasHintAndCorrection: true,
227
+ getQuestionFromIdentifiers,
228
+ };
@@ -0,0 +1,17 @@
1
+ import { Exercise } from "../../../../exercises/exercise.js";
2
+ import { NodeIdentifiers } from "../../../../tree/nodes/nodeConstructor.js";
3
+ type Situation = {
4
+ strInstruction: string;
5
+ strHint: string;
6
+ strCorrection: string;
7
+ dictSets: Record<string, {
8
+ value: number;
9
+ }>;
10
+ nodeIdsCardinal: NodeIdentifiers;
11
+ };
12
+ type Identifiers = {
13
+ situation: Situation;
14
+ };
15
+ export declare const findNumberOfProductsOfCombinationsFromSituation: Exercise<Identifiers>;
16
+ export {};
17
+ //# sourceMappingURL=findNumberOfProductsOfCombinationsFromSituation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findNumberOfProductsOfCombinationsFromSituation.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/sets/combinations/findNumberOfProductsOfCombinationsFromSituation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAeT,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAEL,eAAe,EAChB,MAAM,qCAAqC,CAAC;AAuM7C,KAAK,SAAS,GAAG;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5C,eAAe,EAAE,eAAe,CAAC;CAClC,CAAC;AA0DF,KAAK,WAAW,GAAG;IACjB,SAAS,EAAE,SAAS,CAAC;CACtB,CAAC;AAuOF,eAAO,MAAM,+CAA+C,EAAE,QAAQ,CAAC,WAAW,CAmB/E,CAAC"}
@@ -0,0 +1,388 @@
1
+ import { addValidProp, shuffleProps, tryToAddWrongProp, } from "../../../../exercises/exercise.js";
2
+ import { getDistinctQuestions } from "../../../../exercises/utils/getDistinctQuestions.js";
3
+ import { NodeConstructor, } from "../../../../tree/nodes/nodeConstructor.js";
4
+ import { random } from "../../../../utils/alea/random.js";
5
+ import { randint } from "../../../../math/utils/random/randint.js";
6
+ import { frac, isFractionNode, } from "../../../../tree/nodes/operators/fractionNode.js";
7
+ import { facto } from "../../../../tree/nodes/functions/factorialNode.js";
8
+ import { binom } from "../../../../tree/nodes/operators/binomialCoefficientNode.js";
9
+ import { power } from "../../../../tree/nodes/operators/powerNode.js";
10
+ import { handleVEAError } from "../../../../utils/errors/handleVEAError.js";
11
+ import { parseAlgebraic } from "../../../../tree/parsers/latexParser.js";
12
+ import { NodeComparator } from "../../../../tree/utilities/nodeComparator.js";
13
+ import { isMultiplyNode, multiply, } from "../../../../tree/nodes/operators/multiplyNode.js";
14
+ import { add } from "../../../../tree/nodes/operators/addNode.js";
15
+ import { shuffle } from "../../../../utils/alea/shuffle.js";
16
+ import { coinFlip } from "../../../../utils/alea/coinFlip.js";
17
+ const situationTemplates = [
18
+ {
19
+ strInstruction: `Jade a deux boîtes de perles toutes distinctes : une boîte avec $\${total1}$ perles bleues et une boîte avec $\${total2}$ perles rouges.
20
+ Pour faire un bracelet, Jade prend une poignée de $\${picked1}$ perles bleues et une poignée de $\${picked2}$ perles rouges.
21
+ Combien y a-t-il de prélèvements possibles ?`,
22
+ strHint: `Est-ce que l'ordre a de l'importance ici ? Comment appelle-t-on les sous-ensembles que Jade a prélevés ?
23
+ Fais un compte pour les perles bleues et un autre pour les perles rouges.
24
+ Enfin, trouve une opération pour utiliser les deux comptes qui soit cohérente
25
+ (pour raisonner, tu peux imaginer qu'elle n'a pris qu'une perle de chaque couleur).`,
26
+ strCorrection: `Jade prend un ensemble de $\${picked1}$ perles bleues parmi $\${total1}$.
27
+ Elle prend un sous-ensemble de perles : C'est une combinaison.
28
+ Le nombre de combinaisons possibles pour les perles bleues est :
29
+
30
+ $$
31
+ \${cardinal1}
32
+ $$
33
+
34
+ De même, lorsqu'elle prend un ensemble de $\${picked2}$ perles rouges parmi $\${total2}$.
35
+ Le nombre de combinaisons possibles pour les perles rouges est :
36
+
37
+ $$
38
+ \${cardinal2}
39
+ $$
40
+
41
+ On peut représenter un prélèvement de perles avec un $2$-uplet $(\\text{prélèvement}_{\\text{bleues}};\\text{prélèvement}_{\\text{rouges}})$.
42
+
43
+ Le prélèvement total de Jade est donc un élément du produit cartésien de l'ensemble des prélèvements de perles bleues avec l'ensemble des prélèvements de perles rouges.
44
+ Le nombre de prélèvements possibles est donc :
45
+
46
+ $$
47
+ \${cardinal}
48
+ $$
49
+
50
+ `,
51
+ dictFuncs: {
52
+ total1: () => {
53
+ return {
54
+ value: randint(50, 101),
55
+ };
56
+ },
57
+ picked1: () => {
58
+ return {
59
+ value: randint(22, 41),
60
+ };
61
+ },
62
+ total2: () => {
63
+ return {
64
+ value: randint(26, 46),
65
+ };
66
+ },
67
+ picked2: () => {
68
+ return {
69
+ value: randint(12, 21),
70
+ };
71
+ },
72
+ },
73
+ },
74
+ {
75
+ strInstruction: `Dans une classe de terminale il y a $\${total1}$ filles et $\${total2}$ garçons.
76
+ On consitue une équipe en choisissant $\${picked1}$ filles et $\${picked2}$ garçons.
77
+ Combien d'équipes distinctes peut-on ainsi constituer ?`,
78
+ strHint: `Est-ce que l'ordre a de l'importance ici ? Comment appelle-t-on les sous-équipes que l'on peut constituer ?
79
+ Fais un compte pour les filles et un autre pour les garçons.
80
+ Enfin, trouve une opération pour utiliser les deux comptes qui soit cohérente
81
+ (pour raisonner, tu peux imaginer qu'on n'a pris qu'une fille et un garçon).`,
82
+ strCorrection: `On prend un ensemble de $\${picked1}$ filles parmi $\${total1}$.
83
+ On prend un sous-ensemble de filles : C'est une combinaison.
84
+ Le nombre de combinaisons possibles pour les filles est :
85
+
86
+ $$
87
+ \${cardinal1}
88
+ $$
89
+
90
+ De même, lorsqu'on prend un ensemble de $\${picked2}$ garçons parmi $\${total2}$.
91
+ Le nombre de combinaisons possibles pour les garçons est :
92
+
93
+ $$
94
+ \${cardinal2}
95
+ $$
96
+
97
+ On peut représenter une équipe de filles et de garçons avec un $2$-uplet $(\\text{sous-équipe}_{\\text{filles}};\\text{sous-équipe}_{\\text{garçons}})$.
98
+
99
+ Une équipe de filles et de garçons est donc un élément du produit cartésien des équipes de filles avec les équipes de garçons.
100
+ Le nombre d'équipes possibles est donc :
101
+
102
+ $$
103
+ \${cardinal}
104
+ $$
105
+
106
+ `,
107
+ dictFuncs: {
108
+ total1: () => {
109
+ return {
110
+ value: randint(10, 21),
111
+ };
112
+ },
113
+ total2: () => {
114
+ return {
115
+ value: randint(10, 21),
116
+ };
117
+ },
118
+ picked1: () => {
119
+ return {
120
+ value: randint(3, 7),
121
+ };
122
+ },
123
+ //picked2 is picked1
124
+ },
125
+ },
126
+ {
127
+ strInstruction: `Un fromager a une grande sélection de fromages tous distincts : $\${total1}$ fromages au lait de vache et $\${total2}$ fromages au lait de brebis.
128
+ Pour constituer un plateau de fromages, le fromager prend $\${picked1}$ fromages au lait de vache et $\${picked2}$ fromages au lait de brebis.
129
+ Combien y a-t-il de plateaux possibles ?`,
130
+ strHint: `Est-ce que l'ordre a de l'importance ici ? Comment appelle-t-on les sous-ensembles de chaque type de fromage ?
131
+ Fais un compte pour les fromages au lait de vache et un autre pour les fromages au lait de brebis.
132
+ Enfin, trouve une opération pour utiliser les deux comptes qui soit cohérente
133
+ (pour raisonner, tu peux imaginer qu'il n'a pris qu'un fromage de chaque type).`,
134
+ strCorrection: `Le fromager prend un ensemble de $\${picked1}$ fromages au lait de vache parmi $\${total1}$.
135
+ Il prend un sous-ensemble de fromages : C'est une combinaison.
136
+ Le nombre de combinaisons possibles pour les fromages au lait de vache est :
137
+
138
+ $$
139
+ \${cardinal1}
140
+ $$
141
+
142
+ De même, lorsqu'il prend un ensemble de $\${picked2}$ fromages au lait de brebis parmi $\${total2}$.
143
+ Le nombre de combinaisons possibles pour les fromages au lait de brebis est :
144
+
145
+ $$
146
+ \${cardinal2}
147
+ $$
148
+
149
+ On peut représenter un plateau de fromages avec un $2$-uplet $(\\text{prélèvement}_{\\text{lait de vache}};\\text{prélèvement}_{\\text{lait de brebis}})$.
150
+
151
+ Le plateau peut donc être représenté par un élément du produit cartésien de l'ensemble des prélèvements de fromages au lait de vache avec l'ensemble des prélèvements de fromages au lait de brebis.
152
+ Le nombre de plateaux possibles est donc :
153
+
154
+ $$
155
+ \${cardinal}
156
+ $$
157
+
158
+ `,
159
+ dictFuncs: {
160
+ total1: () => {
161
+ return {
162
+ value: randint(50, 101),
163
+ };
164
+ },
165
+ picked1: () => {
166
+ return {
167
+ value: randint(3, 7),
168
+ };
169
+ },
170
+ total2: () => {
171
+ return {
172
+ value: randint(26, 46),
173
+ };
174
+ },
175
+ picked2: () => {
176
+ return {
177
+ value: randint(3, 7),
178
+ };
179
+ },
180
+ },
181
+ },
182
+ ];
183
+ class SituationConstructor {
184
+ static randomSituationFromTemplate(situationTemplate) {
185
+ const dictSets = Object.entries(situationTemplate.dictFuncs).reduce((acc, [key, func]) => {
186
+ acc[key] = func();
187
+ return acc;
188
+ }, {});
189
+ if (!dictSets["picked2"]) {
190
+ dictSets["picked2"] = dictSets["picked1"];
191
+ }
192
+ const { strInstruction, strCorrection: strCorrectionIncomplete } = Object.entries(dictSets).reduce((acc, [key, miniDict]) => {
193
+ acc.strInstruction = acc.strInstruction.replace(`\${${key}}`, `${miniDict.value}`);
194
+ acc.strCorrection = acc.strCorrection.replace(`\${${key}}`, `${miniDict.value}`);
195
+ return acc;
196
+ }, {
197
+ strInstruction: situationTemplate.strInstruction,
198
+ strCorrection: situationTemplate.strCorrection,
199
+ });
200
+ const { total1: { value: valueTotal1 }, picked1: { value: valuePicked1 }, total2: { value: valueTotal2 }, picked2: { value: valuePicked2 }, } = dictSets;
201
+ const nodeCardinal1 = binom(valueTotal1, valuePicked1);
202
+ const nodeCardinal2 = binom(valueTotal2, valuePicked2);
203
+ const nodeCardinal = multiply(nodeCardinal1, nodeCardinal2);
204
+ const strCorrection = strCorrectionIncomplete
205
+ .replace(`\${cardinal}`, `${nodeCardinal.toTex()}`)
206
+ .replace(`\${cardinal1}`, `${nodeCardinal1.toTex()}`)
207
+ .replace(`\${cardinal2}`, `${nodeCardinal2.toTex()}`);
208
+ return {
209
+ nodeIdsCardinal: nodeCardinal.toIdentifiers(),
210
+ strInstruction,
211
+ strHint: situationTemplate.strHint,
212
+ strCorrection,
213
+ dictSets,
214
+ };
215
+ }
216
+ }
217
+ const getInstruction = (identifiers) => {
218
+ const { situation: { strInstruction }, } = identifiers;
219
+ return strInstruction;
220
+ };
221
+ const getAnswerNode = (identifiers) => {
222
+ const { situation: { nodeIdsCardinal }, } = identifiers;
223
+ const nodeCardinal = NodeConstructor.fromIdentifiers(nodeIdsCardinal);
224
+ return nodeCardinal;
225
+ };
226
+ const getAnswer = (identifiers) => {
227
+ return getAnswerNode(identifiers).toTex();
228
+ };
229
+ const getHint = (identifiers) => {
230
+ const { situation: { strHint }, } = identifiers;
231
+ return `${strHint}`;
232
+ };
233
+ const getCorrection = (identifiers) => {
234
+ const { situation: { strCorrection }, } = identifiers;
235
+ return `${strCorrection}`;
236
+ };
237
+ const getPropositions = (n, { answer, ...identifiers }) => {
238
+ const { situation: { dictSets }, } = identifiers;
239
+ const { total1: { value: valueTotal1 }, picked1: { value: valuePicked1 }, total2: { value: valueTotal2 }, picked2: { value: valuePicked2 }, } = dictSets;
240
+ const propositions = [];
241
+ addValidProp(propositions, answer);
242
+ if (coinFlip()) {
243
+ //student: binom(total1, picked1) + binom(total2, picked2)
244
+ {
245
+ const nodeWrong = add(binom(valueTotal1, valuePicked1), binom(valueTotal2, valuePicked2));
246
+ tryToAddWrongProp(propositions, nodeWrong.toTex());
247
+ }
248
+ }
249
+ {
250
+ const [arrFuncOp1, arrFuncOp2, arrFuncOp3] = shuffle(random([
251
+ [
252
+ [multiply, add],
253
+ [add, multiply],
254
+ [add, multiply],
255
+ ],
256
+ [
257
+ [multiply, add],
258
+ [multiply, add],
259
+ [add, multiply],
260
+ ],
261
+ [
262
+ [multiply, add],
263
+ [multiply, add],
264
+ [multiply, add],
265
+ ],
266
+ ]));
267
+ //student: picked1! \\times picked2!
268
+ {
269
+ const [funcOpMain, funcOpAlt] = arrFuncOp1;
270
+ {
271
+ const nodeWrong = funcOpMain(facto(valuePicked1), facto(valuePicked2));
272
+ tryToAddWrongProp(propositions, nodeWrong.toTex());
273
+ }
274
+ if (coinFlip()) {
275
+ const nodeWrong = funcOpAlt(facto(valuePicked1), facto(valuePicked2));
276
+ tryToAddWrongProp(propositions, nodeWrong.toTex());
277
+ }
278
+ }
279
+ //student: frac(total1!, picked1!) \\times frac(total2!, picked2!)
280
+ {
281
+ const [funcOpMain, funcOpAlt] = arrFuncOp2;
282
+ {
283
+ const nodeWrong = funcOpMain(frac(facto(valueTotal1), facto(valuePicked1)), frac(facto(valueTotal2), facto(valuePicked2)));
284
+ tryToAddWrongProp(propositions, nodeWrong.toTex());
285
+ }
286
+ if (coinFlip()) {
287
+ const nodeWrong = funcOpAlt(frac(facto(valueTotal1), facto(valuePicked1)), frac(facto(valueTotal2), facto(valuePicked2)));
288
+ tryToAddWrongProp(propositions, nodeWrong.toTex());
289
+ }
290
+ }
291
+ //student: power(total1, picked1) \\times power(total2, picked2)
292
+ {
293
+ const [funcOpMain, funcOpAlt] = arrFuncOp3;
294
+ {
295
+ const nodeWrong = funcOpMain(power(valueTotal1, valuePicked1), power(valueTotal2, valuePicked2));
296
+ tryToAddWrongProp(propositions, nodeWrong.toTex());
297
+ }
298
+ if (coinFlip()) {
299
+ const nodeWrong = funcOpAlt(power(valueTotal1, valuePicked1), power(valueTotal2, valuePicked2));
300
+ tryToAddWrongProp(propositions, nodeWrong.toTex());
301
+ }
302
+ }
303
+ }
304
+ return shuffleProps(propositions, n);
305
+ };
306
+ const getKeys = () => {
307
+ const keyFacto = {
308
+ id: "custom",
309
+ label: "!",
310
+ labelType: "tex",
311
+ mathfieldInstructions: {
312
+ method: "write",
313
+ content: "!",
314
+ },
315
+ };
316
+ return [
317
+ // "facto",
318
+ keyFacto,
319
+ "binom",
320
+ ];
321
+ };
322
+ const isAnswerValid = (ans, { answer }) => {
323
+ try {
324
+ const nodeAns = parseAlgebraic(ans);
325
+ const nodeAnswer = parseAlgebraic(answer);
326
+ const isEqualViaSubOrViaFrac = (node1, node2) => NodeComparator.isEqualViaSub(node1, node2) ||
327
+ NodeComparator.isEqualViaFrac(node1, node2);
328
+ if (isMultiplyNode(nodeAns)) {
329
+ if (!isFractionNode(nodeAns.leftChild) &&
330
+ !isFractionNode(nodeAns.rightChild)) {
331
+ //multiply is commutative
332
+ return ((isEqualViaSubOrViaFrac(nodeAns.leftChild, nodeAnswer.leftChild) &&
333
+ isEqualViaSubOrViaFrac(nodeAns.rightChild, nodeAnswer.rightChild)) ||
334
+ (isEqualViaSubOrViaFrac(nodeAns.leftChild, nodeAnswer.rightChild) &&
335
+ isEqualViaSubOrViaFrac(nodeAns.rightChild, nodeAnswer.leftChild)));
336
+ }
337
+ else {
338
+ //fallback
339
+ return NodeComparator.isEqualViaSub(nodeAns, nodeAnswer);
340
+ }
341
+ }
342
+ else if (isFractionNode(nodeAns)) {
343
+ //TODO
344
+ return NodeComparator.isEqualViaSub(nodeAns, nodeAnswer);
345
+ }
346
+ else {
347
+ return NodeComparator.isEqualViaSub(nodeAns, nodeAnswer);
348
+ }
349
+ }
350
+ catch (e) {
351
+ handleVEAError(e);
352
+ return false;
353
+ }
354
+ };
355
+ const getFindNumberOfProductsOfCombinationsFromSituationQuestion = () => {
356
+ const situationTemplate = random(situationTemplates);
357
+ const situation = SituationConstructor.randomSituationFromTemplate(situationTemplate);
358
+ const identifiers = {
359
+ situation,
360
+ };
361
+ return getQuestionFromIdentifiers(identifiers);
362
+ };
363
+ const getQuestionFromIdentifiers = (identifiers) => {
364
+ const question = {
365
+ instruction: getInstruction(identifiers),
366
+ answer: getAnswer(identifiers),
367
+ keys: getKeys(identifiers),
368
+ answerFormat: "tex",
369
+ identifiers,
370
+ hint: getHint(identifiers),
371
+ correction: getCorrection(identifiers),
372
+ };
373
+ return question;
374
+ };
375
+ export const findNumberOfProductsOfCombinationsFromSituation = {
376
+ id: "findNumberOfProductsOfCombinationsFromSituation",
377
+ connector: "=",
378
+ isSingleStep: true,
379
+ label: "Déterminer le nombre de produits de combinaisons à partir d'une situation",
380
+ generator: (nb) => getDistinctQuestions(getFindNumberOfProductsOfCombinationsFromSituationQuestion, nb),
381
+ qcmTimer: 60,
382
+ freeTimer: 60,
383
+ getPropositions,
384
+ isAnswerValid,
385
+ subject: "Mathématiques",
386
+ hasHintAndCorrection: true,
387
+ getQuestionFromIdentifiers,
388
+ };
@@ -0,0 +1,4 @@
1
+ export * from "./proposeCombination.js";
2
+ export * from "./findNumberOfCombinationsFromSituation.js";
3
+ export * from "./findNumberOfProductsOfCombinationsFromSituation.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/sets/combinations/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,4CAA4C,CAAC;AAC3D,cAAc,sDAAsD,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./proposeCombination.js";
2
+ export * from "./findNumberOfCombinationsFromSituation.js";
3
+ export * from "./findNumberOfProductsOfCombinationsFromSituation.js";
@@ -0,0 +1,15 @@
1
+ import { Exercise } from "../../../../exercises/exercise.js";
2
+ import { NodeIdentifiers } from "../../../../tree/nodes/nodeConstructor.js";
3
+ type Item = {
4
+ str: string;
5
+ isValid: boolean;
6
+ };
7
+ type Identifiers = {
8
+ strDescriptionE: string;
9
+ nodeIdsSetE: NodeIdentifiers;
10
+ k: number;
11
+ items: Item[];
12
+ };
13
+ export declare const proposeCombination: Exercise<Identifiers>;
14
+ export {};
15
+ //# sourceMappingURL=proposeCombination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposeCombination.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/sets/combinations/proposeCombination.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAeT,MAAM,6BAA6B,CAAC;AAKrC,OAAO,EAEL,eAAe,EAChB,MAAM,qCAAqC,CAAC;AAwH7C,KAAK,IAAI,GAAG;IACV,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,eAAe,CAAC;IAC7B,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,IAAI,EAAE,CAAC;CACf,CAAC;AAiSF,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,WAAW,CAepD,CAAC"}