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.
- package/lib/exercises/exercise.d.ts +14 -1
- package/lib/exercises/exercise.d.ts.map +1 -1
- package/lib/exercises/math/_debug/debugReorder1.d.ts +8 -0
- package/lib/exercises/math/_debug/debugReorder1.d.ts.map +1 -0
- package/lib/exercises/math/_debug/debugReorder1.js +81 -0
- package/lib/exercises/math/_debug/debugReorder2.d.ts +10 -0
- package/lib/exercises/math/_debug/debugReorder2.d.ts.map +1 -0
- package/lib/exercises/math/_debug/debugReorder2.js +88 -0
- package/lib/exercises/math/_debug/debugReorder3.d.ts +10 -0
- package/lib/exercises/math/_debug/debugReorder3.d.ts.map +1 -0
- package/lib/exercises/math/_debug/debugReorder3.js +81 -0
- package/lib/exercises/math/_debug/index.d.ts +3 -1
- package/lib/exercises/math/_debug/index.d.ts.map +1 -1
- package/lib/exercises/math/_debug/index.js +3 -1
- package/lib/exercises/math/calcul/factorial/index.d.ts +2 -0
- package/lib/exercises/math/calcul/factorial/index.d.ts.map +1 -0
- package/lib/exercises/math/calcul/factorial/index.js +1 -0
- package/lib/exercises/math/calcul/factorial/simplifyQuotientOfFactorialToProduct.d.ts +8 -0
- package/lib/exercises/math/calcul/factorial/simplifyQuotientOfFactorialToProduct.d.ts.map +1 -0
- package/lib/exercises/math/calcul/factorial/simplifyQuotientOfFactorialToProduct.js +199 -0
- package/lib/exercises/math/combinatory/combination/index.d.ts +3 -0
- package/lib/exercises/math/combinatory/combination/index.d.ts.map +1 -0
- package/lib/exercises/math/combinatory/combination/index.js +2 -0
- package/lib/exercises/math/combinatory/combination/mentalCalculateCombination.d.ts +11 -0
- package/lib/exercises/math/combinatory/combination/mentalCalculateCombination.d.ts.map +1 -0
- package/lib/exercises/math/combinatory/combination/mentalCalculateCombination.js +225 -0
- package/lib/exercises/math/combinatory/combination/writeCombinationFormulaUsingFactorial.d.ts +13 -0
- package/lib/exercises/math/combinatory/combination/writeCombinationFormulaUsingFactorial.d.ts.map +1 -0
- package/lib/exercises/math/combinatory/combination/writeCombinationFormulaUsingFactorial.js +285 -0
- package/lib/exercises/math/dataRepresentations/scatterPlot/scatterPlotInterpreting.d.ts.map +1 -1
- package/lib/exercises/math/dataRepresentations/scatterPlot/scatterPlotInterpreting.js +1 -1
- package/lib/exercises/math/derivation/derivative/trigo/productOfSinAXPlusBCosCXPlusDDerivative.d.ts +9 -0
- package/lib/exercises/math/derivation/derivative/trigo/productOfSinAXPlusBCosCXPlusDDerivative.d.ts.map +1 -0
- package/lib/exercises/math/derivation/derivative/trigo/productOfSinAXPlusBCosCXPlusDDerivative.js +209 -0
- package/lib/exercises/math/derivation/derivative/trigo/sinAndCosMixedWithSquareDerivative.d.ts +9 -0
- package/lib/exercises/math/derivation/derivative/trigo/sinAndCosMixedWithSquareDerivative.d.ts.map +1 -0
- package/lib/exercises/math/derivation/derivative/trigo/sinAndCosMixedWithSquareDerivative.js +359 -0
- package/lib/exercises/math/derivation/derivative/trigo/sinCosDerivativeRewriteUsingCos2PlusSin2Equals1.d.ts +11 -0
- package/lib/exercises/math/derivation/derivative/trigo/sinCosDerivativeRewriteUsingCos2PlusSin2Equals1.d.ts.map +1 -0
- package/lib/exercises/math/derivation/derivative/trigo/sinCosDerivativeRewriteUsingCos2PlusSin2Equals1.js +445 -0
- package/lib/exercises/math/functions/affines/affineVarTableOnBoundedInterval.d.ts.map +1 -1
- package/lib/exercises/math/functions/affines/affineVarTableOnBoundedInterval.js +2 -3
- package/lib/exercises/math/index.d.ts +1 -0
- package/lib/exercises/math/index.d.ts.map +1 -1
- package/lib/exercises/math/index.js +1 -1
- package/lib/exercises/math/limits/sequenceGeometricLimit.d.ts.map +1 -1
- package/lib/exercises/math/limits/sequenceGeometricLimit.js +9 -0
- package/lib/exercises/math/primitive/constantPrimitive.d.ts +8 -5
- package/lib/exercises/math/primitive/constantPrimitive.d.ts.map +1 -1
- package/lib/exercises/math/primitive/constantPrimitive.js +40 -21
- package/lib/exercises/math/probaStat/stats2var/averagePoint.d.ts.map +1 -1
- package/lib/exercises/math/probaStat/stats2var/averagePoint.js +34 -2
- package/lib/exercises/math/sequences/geometric/graph/geometricFindThresholdFromGraph.d.ts +15 -0
- package/lib/exercises/math/sequences/geometric/graph/geometricFindThresholdFromGraph.d.ts.map +1 -0
- package/lib/exercises/math/sequences/geometric/graph/geometricFindThresholdFromGraph.js +255 -0
- package/lib/exercises/math/sequences/geometric/graph/geometricFindThresholdUsingCalculator.d.ts +15 -0
- package/lib/exercises/math/sequences/geometric/graph/geometricFindThresholdUsingCalculator.d.ts.map +1 -0
- package/lib/exercises/math/sequences/geometric/graph/geometricFindThresholdUsingCalculator.js +242 -0
- package/lib/exercises/math/sequences/geometric/graph/geometricPlaceFirstPoints.js +4 -4
- package/lib/exercises/math/sequences/geometric/graph/geometricSignOfReasonFromGraph.d.ts +12 -0
- package/lib/exercises/math/sequences/geometric/graph/geometricSignOfReasonFromGraph.d.ts.map +1 -0
- package/lib/exercises/math/sequences/geometric/graph/geometricSignOfReasonFromGraph.js +161 -0
- package/lib/exercises/math/sets/cartesianProduct/findCardinalOfCartesianProductOfFiniteSets.d.ts +10 -0
- package/lib/exercises/math/sets/cartesianProduct/findCardinalOfCartesianProductOfFiniteSets.d.ts.map +1 -0
- package/lib/exercises/math/sets/cartesianProduct/findCardinalOfCartesianProductOfFiniteSets.js +224 -0
- package/lib/exercises/math/sets/cartesianProduct/findCardinalOfCartesianProductOfFiniteSetsFromSituation.d.ts +18 -0
- package/lib/exercises/math/sets/cartesianProduct/findCardinalOfCartesianProductOfFiniteSetsFromSituation.d.ts.map +1 -0
- package/lib/exercises/math/sets/cartesianProduct/findCardinalOfCartesianProductOfFiniteSetsFromSituation.js +198 -0
- package/lib/exercises/math/sets/cartesianProduct/findCardinalOfPowEK.d.ts +10 -0
- package/lib/exercises/math/sets/cartesianProduct/findCardinalOfPowEK.d.ts.map +1 -0
- package/lib/exercises/math/sets/cartesianProduct/findCardinalOfPowEK.js +231 -0
- package/lib/exercises/math/sets/cartesianProduct/findNumberOfPasswordsWithLettersAndNumbers.d.ts +19 -0
- package/lib/exercises/math/sets/cartesianProduct/findNumberOfPasswordsWithLettersAndNumbers.d.ts.map +1 -0
- package/lib/exercises/math/sets/cartesianProduct/findNumberOfPasswordsWithLettersAndNumbers.js +187 -0
- package/lib/exercises/math/sets/cartesianProduct/index.d.ts +7 -0
- package/lib/exercises/math/sets/cartesianProduct/index.d.ts.map +1 -0
- package/lib/exercises/math/sets/cartesianProduct/index.js +6 -0
- package/lib/exercises/math/sets/cartesianProduct/proposeElementInCartesianProductOfFiniteSets.d.ts +15 -0
- package/lib/exercises/math/sets/cartesianProduct/proposeElementInCartesianProductOfFiniteSets.d.ts.map +1 -0
- package/lib/exercises/math/sets/cartesianProduct/proposeElementInCartesianProductOfFiniteSets.js +291 -0
- package/lib/exercises/math/sets/cartesianProduct/proposeElementInPowEK.d.ts +15 -0
- package/lib/exercises/math/sets/cartesianProduct/proposeElementInPowEK.d.ts.map +1 -0
- package/lib/exercises/math/sets/cartesianProduct/proposeElementInPowEK.js +274 -0
- package/lib/exercises/math/sets/combinations/findNumberOfCombinationsFromSituation.d.ts +17 -0
- package/lib/exercises/math/sets/combinations/findNumberOfCombinationsFromSituation.d.ts.map +1 -0
- package/lib/exercises/math/sets/combinations/findNumberOfCombinationsFromSituation.js +228 -0
- package/lib/exercises/math/sets/combinations/findNumberOfProductsOfCombinationsFromSituation.d.ts +17 -0
- package/lib/exercises/math/sets/combinations/findNumberOfProductsOfCombinationsFromSituation.d.ts.map +1 -0
- package/lib/exercises/math/sets/combinations/findNumberOfProductsOfCombinationsFromSituation.js +388 -0
- package/lib/exercises/math/sets/combinations/index.d.ts +4 -0
- package/lib/exercises/math/sets/combinations/index.d.ts.map +1 -0
- package/lib/exercises/math/sets/combinations/index.js +3 -0
- package/lib/exercises/math/sets/combinations/proposeCombination.d.ts +15 -0
- package/lib/exercises/math/sets/combinations/proposeCombination.d.ts.map +1 -0
- package/lib/exercises/math/sets/combinations/proposeCombination.js +347 -0
- package/lib/exercises/math/sets/partialPermutations/findNumberOfPartialPermutationsFromSituation.d.ts +16 -0
- package/lib/exercises/math/sets/partialPermutations/findNumberOfPartialPermutationsFromSituation.d.ts.map +1 -0
- package/lib/exercises/math/sets/partialPermutations/findNumberOfPartialPermutationsFromSituation.js +186 -0
- package/lib/exercises/math/sets/partialPermutations/findNumberOfPermutationsFromSituation.d.ts +17 -0
- package/lib/exercises/math/sets/partialPermutations/findNumberOfPermutationsFromSituation.d.ts.map +1 -0
- package/lib/exercises/math/sets/partialPermutations/findNumberOfPermutationsFromSituation.js +232 -0
- package/lib/exercises/math/sets/partialPermutations/index.d.ts +4 -0
- package/lib/exercises/math/sets/partialPermutations/index.d.ts.map +1 -0
- package/lib/exercises/math/sets/partialPermutations/index.js +3 -0
- package/lib/exercises/math/sets/partialPermutations/proposePartialPermutation.d.ts +15 -0
- package/lib/exercises/math/sets/partialPermutations/proposePartialPermutation.d.ts.map +1 -0
- package/lib/exercises/math/sets/partialPermutations/proposePartialPermutation.js +343 -0
- package/lib/exercises/math/trigonometry/functions/parityOfCosAXTimesSinBX.d.ts +8 -0
- package/lib/exercises/math/trigonometry/functions/parityOfCosAXTimesSinBX.d.ts.map +1 -0
- package/lib/exercises/math/trigonometry/functions/parityOfCosAXTimesSinBX.js +193 -0
- package/lib/index.d.ts +15 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/math/sets/setOperations.d.ts +9 -0
- package/lib/math/sets/setOperations.d.ts.map +1 -0
- package/lib/math/sets/setOperations.js +84 -0
- package/lib/math/sets/tuple.d.ts +12 -0
- package/lib/math/sets/tuple.d.ts.map +1 -0
- package/lib/math/sets/tuple.js +17 -0
- package/lib/server.js +25 -0
- package/lib/tree/utilities/nodePrinter.d.ts +7 -0
- package/lib/tree/utilities/nodePrinter.d.ts.map +1 -0
- package/lib/tree/utilities/nodePrinter.js +36 -0
- package/package.json +1 -1
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { addValidProp, tryToAddWrongProp, } from "../../../../../exercises/exercise.js";
|
|
2
|
+
import { getOptionFirstTermRankOneStuff, } from "../../../../../exercises/options/optionFirstTermRankOne.js";
|
|
3
|
+
import { toolBarConstructor } from "../../../../../exercises/utils/geogebra/toolBarConstructor.js";
|
|
4
|
+
import { getDistinctQuestions } from "../../../../../exercises/utils/getDistinctQuestions.js";
|
|
5
|
+
import { GeogebraConstructor } from "../../../../../geogebra/geogebraConstructor.js";
|
|
6
|
+
import { Point } from "../../../../../math/geometry/point.js";
|
|
7
|
+
import { NodeConstructor, } from "../../../../../tree/nodes/nodeConstructor.js";
|
|
8
|
+
import { frac } from "../../../../../tree/nodes/operators/fractionNode.js";
|
|
9
|
+
import { multiply } from "../../../../../tree/nodes/operators/multiplyNode.js";
|
|
10
|
+
import { power } from "../../../../../tree/nodes/operators/powerNode.js";
|
|
11
|
+
import { coinFlip } from "../../../../../utils/alea/coinFlip.js";
|
|
12
|
+
import { random } from "../../../../../utils/alea/random.js";
|
|
13
|
+
const nbPoints = 4;
|
|
14
|
+
const getArrPoint = (identifiers) => {
|
|
15
|
+
const { firstRank, nodeIdsInitial, nodeIdsReason } = identifiers;
|
|
16
|
+
const [nodeInitial, nodeReason] = [nodeIdsInitial, nodeIdsReason].map((nodeIds) => NodeConstructor.fromIdentifiers(nodeIds));
|
|
17
|
+
const arrNodeTerm = [...Array(nbPoints).keys()].map((i) => multiply(nodeInitial, power(nodeReason, i))
|
|
18
|
+
.simplify({
|
|
19
|
+
towardsDistribute: true,
|
|
20
|
+
calculatePowers: true,
|
|
21
|
+
distributePowersOnFrac: true,
|
|
22
|
+
})
|
|
23
|
+
.simplify({ towardsDistribute: false }));
|
|
24
|
+
const arrPoint = arrNodeTerm.map((nodeTerm, i) => {
|
|
25
|
+
const nodeX = (firstRank + i).toTree();
|
|
26
|
+
return new Point(`P${firstRank + i}`, nodeX, nodeTerm);
|
|
27
|
+
});
|
|
28
|
+
return arrPoint;
|
|
29
|
+
};
|
|
30
|
+
const getInstruction = () => {
|
|
31
|
+
return `Dans le repère ci-dessous, on a placé les points représentant les $${nbPoints}$ premiers termes d'une suite géométrique $u$.
|
|
32
|
+
Que peut-on en déduire quant au signe de sa raison ?`;
|
|
33
|
+
};
|
|
34
|
+
const getAnswer = (identifiers) => {
|
|
35
|
+
const { nodeIdsReason } = identifiers;
|
|
36
|
+
const nodeReason = NodeConstructor.fromIdentifiers(nodeIdsReason);
|
|
37
|
+
const indexAnswer = nodeReason.evaluate() > 0 ? 0 : 1;
|
|
38
|
+
return ["La raison est positive.", "La raison est négative."][indexAnswer];
|
|
39
|
+
};
|
|
40
|
+
const getHint = () => {
|
|
41
|
+
return `Dans le nuage de point qui représente la suite, l'abscisse de chaque point est le rang du terme, et l'ordonnée est le terme en lui-même.
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
Dans une suite géométrique, pour calculer le terme suivant, on multiplie par la raison.
|
|
45
|
+
Si la raison est positive, le signe sera conservé.
|
|
46
|
+
Si la raison est négative, les deux termes seront de signes différents.`;
|
|
47
|
+
};
|
|
48
|
+
const getCorrection = (identifiers) => {
|
|
49
|
+
const answer = getAnswer(identifiers);
|
|
50
|
+
return `Dans le nuage de point qui représente la suite, l'abscisse de chaque point est le rang du terme, et l'ordonnée est le terme en lui-même.
|
|
51
|
+
|
|
52
|
+
Dans une suite géométrique, pour calculer le terme suivant, on multiplie par la raison.
|
|
53
|
+
Si la raison est positive, le signe sera conservé.
|
|
54
|
+
Si la raison est négative, les deux termes seront de signes différents.
|
|
55
|
+
|
|
56
|
+
Ici, deux termes consécutifs sont toujours de ${answer === "La raison est positive." ? "même signe" : "signes opposés"}.
|
|
57
|
+
Par conséquent, ${answer.toLocaleLowerCase()}.
|
|
58
|
+
|
|
59
|
+
`;
|
|
60
|
+
};
|
|
61
|
+
const getGGBOptions = (identifiers) => {
|
|
62
|
+
const arrPoint = getArrPoint(identifiers);
|
|
63
|
+
const values = arrPoint.map((point) => point.y.evaluate());
|
|
64
|
+
const ggb = new GeogebraConstructor({
|
|
65
|
+
commands: [
|
|
66
|
+
...arrPoint.flatMap((point) => point.toGGBCommand({ color: `#000000`, showLabel: false })),
|
|
67
|
+
],
|
|
68
|
+
customToolBar: toolBarConstructor({
|
|
69
|
+
point: true,
|
|
70
|
+
}),
|
|
71
|
+
});
|
|
72
|
+
const yMin = Math.min(...values);
|
|
73
|
+
const yMax = Math.max(...values);
|
|
74
|
+
return ggb.getOptions({
|
|
75
|
+
coords: [-1, 6, Math.min(yMin, 0) - 1, Math.max(yMax, 1) + 1],
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
const getPropositions = (_, { answer }) => {
|
|
79
|
+
const propositions = [];
|
|
80
|
+
["La raison est positive.", "La raison est négative."].forEach((strYN) => {
|
|
81
|
+
if (strYN === answer) {
|
|
82
|
+
addValidProp(propositions, strYN, "raw");
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
tryToAddWrongProp(propositions, strYN, "raw");
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
return propositions;
|
|
89
|
+
};
|
|
90
|
+
const getGeometricSignOfReasonFromGraphQuestion = (optsIn) => {
|
|
91
|
+
const opts = optsIn ?? optsDefault;
|
|
92
|
+
const firstRank = opts?.firstTermRankOne ? 1 : 0;
|
|
93
|
+
const [nodeInitialAbs, nodeReasonAbs] = random([
|
|
94
|
+
//increasing
|
|
95
|
+
[(1).toTree(), (2).toTree()],
|
|
96
|
+
[(1).toTree(), frac(3, 2)],
|
|
97
|
+
[(1).toTree(), frac(4, 3)],
|
|
98
|
+
// [(1).toTree(), frac(5, 3)],
|
|
99
|
+
[frac(1, 2), (2).toTree()],
|
|
100
|
+
[frac(1, 2), frac(3, 2)],
|
|
101
|
+
[frac(1, 3), (3).toTree()],
|
|
102
|
+
[(2).toTree(), frac(3, 2)],
|
|
103
|
+
[(2).toTree(), frac(4, 3)],
|
|
104
|
+
//decreasing
|
|
105
|
+
[(8).toTree(), frac(1, 2)],
|
|
106
|
+
[(9).toTree(), frac(1, 3)],
|
|
107
|
+
[(9).toTree(), frac(2, 3)],
|
|
108
|
+
[(8).toTree(), frac(3, 4)],
|
|
109
|
+
// [(10).toTree(), frac(3, 5)],
|
|
110
|
+
]);
|
|
111
|
+
const nodeInitial = (() => {
|
|
112
|
+
const sign = coinFlip() ? +1 : -1;
|
|
113
|
+
return multiply(sign, nodeInitialAbs).simplify({
|
|
114
|
+
towardsDistribute: true,
|
|
115
|
+
});
|
|
116
|
+
})();
|
|
117
|
+
const nodeReason = (() => {
|
|
118
|
+
const sign = coinFlip() ? +1 : -1;
|
|
119
|
+
return multiply(sign, nodeReasonAbs).simplify({
|
|
120
|
+
towardsDistribute: true,
|
|
121
|
+
});
|
|
122
|
+
})();
|
|
123
|
+
const identifiers = {
|
|
124
|
+
firstRank,
|
|
125
|
+
nodeIdsInitial: nodeInitial.toIdentifiers(),
|
|
126
|
+
nodeIdsReason: nodeReason.toIdentifiers(),
|
|
127
|
+
};
|
|
128
|
+
return getQuestionFromIdentifiers(identifiers, opts);
|
|
129
|
+
};
|
|
130
|
+
const getQuestionFromIdentifiers = (identifiers) => {
|
|
131
|
+
return {
|
|
132
|
+
answer: getAnswer(identifiers),
|
|
133
|
+
instruction: getInstruction(identifiers),
|
|
134
|
+
ggbOptions: getGGBOptions(identifiers),
|
|
135
|
+
identifiers,
|
|
136
|
+
hint: getHint(identifiers),
|
|
137
|
+
correction: getCorrection(identifiers),
|
|
138
|
+
};
|
|
139
|
+
};
|
|
140
|
+
const { optsDefaultFirstTermRankOne, generatorOptionFirstTermRankOne } = getOptionFirstTermRankOneStuff(false);
|
|
141
|
+
const optsDefault = Object.assign({}, optsDefaultFirstTermRankOne, {});
|
|
142
|
+
const options = [generatorOptionFirstTermRankOne];
|
|
143
|
+
export const geometricSignOfReasonFromGraph = {
|
|
144
|
+
id: "geometricSignOfReasonFromGraph",
|
|
145
|
+
label: "À partir d'un nuage de point d'une suite géométrique, retrouver le signe de sa raison",
|
|
146
|
+
isSingleStep: true,
|
|
147
|
+
generator: (nb, opts) => getDistinctQuestions(() => getGeometricSignOfReasonFromGraphQuestion(opts), nb),
|
|
148
|
+
ggbTimer: 60,
|
|
149
|
+
subject: "Mathématiques",
|
|
150
|
+
getHint,
|
|
151
|
+
getCorrection,
|
|
152
|
+
hasHintAndCorrection: true,
|
|
153
|
+
getInstruction,
|
|
154
|
+
getGGBOptions,
|
|
155
|
+
hasGeogebra: true,
|
|
156
|
+
answerType: "QCU",
|
|
157
|
+
getAnswer,
|
|
158
|
+
getPropositions,
|
|
159
|
+
getQuestionFromIdentifiers,
|
|
160
|
+
options,
|
|
161
|
+
};
|
package/lib/exercises/math/sets/cartesianProduct/findCardinalOfCartesianProductOfFiniteSets.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Exercise } from "../../../../exercises/exercise.js";
|
|
2
|
+
import { NodeIdentifiers } from "../../../../tree/nodes/nodeConstructor.js";
|
|
3
|
+
type Identifiers = {
|
|
4
|
+
nodeIdsSetA: NodeIdentifiers;
|
|
5
|
+
nodeIdsSetB: NodeIdentifiers;
|
|
6
|
+
isAskedACrossB: boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare const findCardinalOfCartesianProductOfFiniteSets: Exercise<Identifiers>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=findCardinalOfCartesianProductOfFiniteSets.d.ts.map
|
package/lib/exercises/math/sets/cartesianProduct/findCardinalOfCartesianProductOfFiniteSets.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findCardinalOfCartesianProductOfFiniteSets.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/sets/cartesianProduct/findCardinalOfCartesianProductOfFiniteSets.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAeT,MAAM,6BAA6B,CAAC;AAKrC,OAAO,EAEL,eAAe,EAChB,MAAM,qCAAqC,CAAC;AAsC7C,KAAK,WAAW,GAAG;IACjB,WAAW,EAAE,eAAe,CAAC;IAC7B,WAAW,EAAE,eAAe,CAAC;IAC7B,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AA8OF,eAAO,MAAM,0CAA0C,EAAE,QAAQ,CAAC,WAAW,CAkB1E,CAAC"}
|
package/lib/exercises/math/sets/cartesianProduct/findCardinalOfCartesianProductOfFiniteSets.js
ADDED
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { addValidProp, shuffleProps, tryToAddWrongProp, } from "../../../../exercises/exercise.js";
|
|
2
|
+
import { getDistinctQuestions } from "../../../../exercises/utils/getDistinctQuestions.js";
|
|
3
|
+
import { alignTex } from "../../../../utils/latex/alignTex.js";
|
|
4
|
+
import { shuffle } from "../../../../utils/alea/shuffle.js";
|
|
5
|
+
import { handleVEAError } from "../../../../utils/errors/handleVEAError.js";
|
|
6
|
+
import { NodeConstructor, } from "../../../../tree/nodes/nodeConstructor.js";
|
|
7
|
+
import { DiscreteSetNode } from "../../../../tree/nodes/sets/discreteSetNode.js";
|
|
8
|
+
import { isVariableNode, VariableNode, } from "../../../../tree/nodes/variables/variableNode.js";
|
|
9
|
+
import { random } from "../../../../utils/alea/random.js";
|
|
10
|
+
import { coinFlip } from "../../../../utils/alea/coinFlip.js";
|
|
11
|
+
import { multiply } from "../../../../tree/nodes/operators/multiplyNode.js";
|
|
12
|
+
import { add } from "../../../../tree/nodes/operators/addNode.js";
|
|
13
|
+
import { power } from "../../../../tree/nodes/operators/powerNode.js";
|
|
14
|
+
import { numberVEA } from "../../../../exercises/vea/numberVEA.js";
|
|
15
|
+
import { randint } from "../../../../math/utils/random/randint.js";
|
|
16
|
+
import { isNumberNode } from "../../../../tree/nodes/numbers/numberNode.js";
|
|
17
|
+
/*
|
|
18
|
+
This toTex() function supports discreteSetNodes with variableNodes inside (this won't create unknown command \\lbracem if m is the first element)
|
|
19
|
+
*/
|
|
20
|
+
const discreteSetNodeToTex = (discreteSetNode) => {
|
|
21
|
+
const myCompare = (node1, node2) => {
|
|
22
|
+
if (isNumberNode(node1) && isNumberNode(node2)) {
|
|
23
|
+
return node1.evaluate() - node2.evaluate();
|
|
24
|
+
}
|
|
25
|
+
else if (isNumberNode(node1) && isVariableNode(node2)) {
|
|
26
|
+
return 1;
|
|
27
|
+
}
|
|
28
|
+
else if (isVariableNode(node1) && isNumberNode(node2)) {
|
|
29
|
+
return -1;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
return node1.toTex().localeCompare(node2.toTex());
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
return `\\lbrace ${discreteSetNode.elements
|
|
36
|
+
.toSorted(myCompare)
|
|
37
|
+
.map((node) => node.toTex())
|
|
38
|
+
.join(";")} \\rbrace`;
|
|
39
|
+
};
|
|
40
|
+
const getInstruction = (identifiers) => {
|
|
41
|
+
const { nodeIdsSetA, nodeIdsSetB, isAskedACrossB } = identifiers;
|
|
42
|
+
const [nodeSetA, nodeSetB] = [nodeIdsSetA, nodeIdsSetB].map((nodeIds) => NodeConstructor.fromIdentifiers(nodeIds));
|
|
43
|
+
const texAskedSet = isAskedACrossB ? `A \\times B` : `B \\times A`;
|
|
44
|
+
return `Soient deux ensembles :
|
|
45
|
+
|
|
46
|
+
${alignTex([
|
|
47
|
+
["A", nodeSetA],
|
|
48
|
+
["B", nodeSetB],
|
|
49
|
+
].map(([letter, nodeSet]) => [letter, "=", discreteSetNodeToTex(nodeSet)]))}
|
|
50
|
+
|
|
51
|
+
Donner le cardinal de $${texAskedSet}$.`;
|
|
52
|
+
};
|
|
53
|
+
const getAnswerNode = (identifiers) => {
|
|
54
|
+
const { nodeIdsSetA, nodeIdsSetB, isAskedACrossB } = identifiers;
|
|
55
|
+
const [nodeSetA, nodeSetB] = [nodeIdsSetA, nodeIdsSetB].map((nodeIds) => NodeConstructor.fromIdentifiers(nodeIds));
|
|
56
|
+
const [nodeSetF, nodeSetS] = isAskedACrossB
|
|
57
|
+
? [nodeSetA, nodeSetB]
|
|
58
|
+
: [nodeSetB, nodeSetA];
|
|
59
|
+
const [cardF, cardS] = [nodeSetF, nodeSetS].map((discreteSetNode) => discreteSetNode.elements.length);
|
|
60
|
+
const nodeCardinal = multiply(cardF, cardS);
|
|
61
|
+
return nodeCardinal;
|
|
62
|
+
};
|
|
63
|
+
const getAnswer = (identifiers) => {
|
|
64
|
+
return getAnswerNode(identifiers)
|
|
65
|
+
.simplify({ towardsDistribute: true })
|
|
66
|
+
.toTex();
|
|
67
|
+
};
|
|
68
|
+
const getHint = () => {
|
|
69
|
+
return `Le cardinal d'un ensemble fini est le nombre d'éléments de l'ensemble.
|
|
70
|
+
|
|
71
|
+
Soient deux ensembles $C$ et $D$.
|
|
72
|
+
Les éléments de $D \\times C$ sont tous les couples que l'on peut former
|
|
73
|
+
avec comme premier élément un élement de $D$, et comme deuxième élément un élément de $C$.
|
|
74
|
+
|
|
75
|
+
Voici un exemple :
|
|
76
|
+
|
|
77
|
+
$$
|
|
78
|
+
C = \\lbrace 32, 42, 52 \\rbrace
|
|
79
|
+
$$
|
|
80
|
+
|
|
81
|
+
$$
|
|
82
|
+
D = \\lbrace u, v \\rbrace
|
|
83
|
+
$$
|
|
84
|
+
|
|
85
|
+
Voici les couples appartenant à $D \\times C$ :
|
|
86
|
+
|
|
87
|
+
$$
|
|
88
|
+
(u,32),(u,42),(u,52),
|
|
89
|
+
$$
|
|
90
|
+
|
|
91
|
+
$$
|
|
92
|
+
(v,32),(v,42),(v,52)
|
|
93
|
+
$$
|
|
94
|
+
|
|
95
|
+
Le cardinal de $D \\times C$ est donc $2\\times3=6$.`;
|
|
96
|
+
};
|
|
97
|
+
const getCorrection = (identifiers) => {
|
|
98
|
+
const { nodeIdsSetA, nodeIdsSetB, isAskedACrossB } = identifiers;
|
|
99
|
+
const [nodeSetA, nodeSetB] = [nodeIdsSetA, nodeIdsSetB].map((nodeIds) => NodeConstructor.fromIdentifiers(nodeIds));
|
|
100
|
+
const [texSetF, texSetS] = isAskedACrossB ? ["A", "B"] : ["B", "A"];
|
|
101
|
+
const [nodeSetF, nodeSetS] = isAskedACrossB
|
|
102
|
+
? [nodeSetA, nodeSetB]
|
|
103
|
+
: [nodeSetB, nodeSetA];
|
|
104
|
+
const texAskedSet = `${texSetF} \\times ${texSetS}`;
|
|
105
|
+
const [cardF, cardS] = [nodeSetF, nodeSetS].map((discreteSetNode) => discreteSetNode.elements.length);
|
|
106
|
+
return `Le cardinal d'un ensemble fini est le nombre d'éléments de l'ensemble.
|
|
107
|
+
|
|
108
|
+
${alignTex([
|
|
109
|
+
[
|
|
110
|
+
`\\text{card}(${texAskedSet})`,
|
|
111
|
+
"=",
|
|
112
|
+
`\\text{card}(${texSetF}) \\times \\text{card}(${texSetS})`,
|
|
113
|
+
],
|
|
114
|
+
[``, "=", `${cardF.frenchify()} \\times ${cardS.frenchify()}`],
|
|
115
|
+
[``, "=", `${(cardF * cardS).frenchify()}`],
|
|
116
|
+
])}
|
|
117
|
+
|
|
118
|
+
`;
|
|
119
|
+
};
|
|
120
|
+
const getPropositions = (n, { answer, ...identifiers }) => {
|
|
121
|
+
const { nodeIdsSetA, nodeIdsSetB } = identifiers;
|
|
122
|
+
const [nodeSetA, nodeSetB] = [nodeIdsSetA, nodeIdsSetB].map((nodeIds) => NodeConstructor.fromIdentifiers(nodeIds));
|
|
123
|
+
const [cardA, cardB] = [nodeSetA, nodeSetB].map((discreteSetNode) => discreteSetNode.elements.length);
|
|
124
|
+
const propositions = [];
|
|
125
|
+
addValidProp(propositions, answer);
|
|
126
|
+
tryToAddWrongProp(propositions, "2");
|
|
127
|
+
tryToAddWrongProp(propositions, add(cardA, cardB).simplify({ towardsDistribute: true }).toTex());
|
|
128
|
+
tryToAddWrongProp(propositions, power(cardA, cardB).simplify({ towardsDistribute: true }).toTex());
|
|
129
|
+
tryToAddWrongProp(propositions, power(cardB, cardA).simplify({ towardsDistribute: true }).toTex());
|
|
130
|
+
return shuffleProps(propositions, n);
|
|
131
|
+
};
|
|
132
|
+
const getKeys = () => {
|
|
133
|
+
return [];
|
|
134
|
+
};
|
|
135
|
+
const isAnswerValid = (ans, { answer }) => {
|
|
136
|
+
try {
|
|
137
|
+
return numberVEA(ans, answer);
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
return handleVEAError(err);
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
const getFindCardinalOfCartesianProductOfFiniteSetsQuestion = () => {
|
|
144
|
+
const poolNumberNode = [...Array(20).keys()]
|
|
145
|
+
.map((i) => i * 2)
|
|
146
|
+
.map((v) => v.toTree());
|
|
147
|
+
const poolVarNode1 = ["c", "d", "k"].map((letter) => new VariableNode(letter));
|
|
148
|
+
const poolVarNode2 = ["\\alpha", "\\beta", "\\gamma", "\\delta"].map((letter) => new VariableNode(letter));
|
|
149
|
+
function createRandomSetNode(funcCreateElem, nbElem) {
|
|
150
|
+
const arrNode = shuffle([...Array(nbElem).keys()].reduce((acc, i) => {
|
|
151
|
+
acc = [...acc, funcCreateElem(i, acc)];
|
|
152
|
+
return acc;
|
|
153
|
+
}, []));
|
|
154
|
+
return new DiscreteSetNode(arrNode);
|
|
155
|
+
}
|
|
156
|
+
const nbElemA = randint(2, 10);
|
|
157
|
+
const nbElemB = randint(2, 10, [nbElemA]);
|
|
158
|
+
const poolCommon = [...poolNumberNode, ...poolVarNode1, ...poolVarNode2];
|
|
159
|
+
const poolAOnly = [
|
|
160
|
+
new VariableNode("b"),
|
|
161
|
+
...[...Array(20).keys()].map((i) => i * 2 + 1).map((v) => v.toTree()),
|
|
162
|
+
];
|
|
163
|
+
const poolBOnly = ["a", "m", "n"].map((letter) => new VariableNode(letter));
|
|
164
|
+
function* genFuncElemA() {
|
|
165
|
+
yield* shuffle(poolCommon);
|
|
166
|
+
return "Done";
|
|
167
|
+
}
|
|
168
|
+
function* genFuncElemB() {
|
|
169
|
+
yield* shuffle(poolCommon);
|
|
170
|
+
return "Done";
|
|
171
|
+
}
|
|
172
|
+
const [generateElemA, generateElemB] = [genFuncElemA(), genFuncElemB()];
|
|
173
|
+
//ensure A\B is not empty
|
|
174
|
+
const nodeSetA = createRandomSetNode((i) => {
|
|
175
|
+
if (i === nbElemA - 1) {
|
|
176
|
+
return random(poolAOnly);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
return generateElemA.next().value;
|
|
180
|
+
}
|
|
181
|
+
}, nbElemA);
|
|
182
|
+
//ensure B\A is not empty
|
|
183
|
+
const nodeSetB = createRandomSetNode((i, _arrPrevious) => {
|
|
184
|
+
if (i === nbElemB - 1) {
|
|
185
|
+
return random(poolBOnly);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
return generateElemB.next().value;
|
|
189
|
+
}
|
|
190
|
+
}, nbElemB);
|
|
191
|
+
const isAskedACrossB = coinFlip();
|
|
192
|
+
const identifiers = {
|
|
193
|
+
nodeIdsSetA: nodeSetA.toIdentifiers(),
|
|
194
|
+
nodeIdsSetB: nodeSetB.toIdentifiers(),
|
|
195
|
+
isAskedACrossB,
|
|
196
|
+
};
|
|
197
|
+
return getQuestionFromIdentifiers(identifiers);
|
|
198
|
+
};
|
|
199
|
+
const getQuestionFromIdentifiers = (identifiers) => {
|
|
200
|
+
const question = {
|
|
201
|
+
instruction: getInstruction(identifiers),
|
|
202
|
+
answer: getAnswer(identifiers),
|
|
203
|
+
keys: getKeys(identifiers),
|
|
204
|
+
answerFormat: "tex",
|
|
205
|
+
identifiers,
|
|
206
|
+
hint: getHint(identifiers),
|
|
207
|
+
correction: getCorrection(identifiers),
|
|
208
|
+
};
|
|
209
|
+
return question;
|
|
210
|
+
};
|
|
211
|
+
export const findCardinalOfCartesianProductOfFiniteSets = {
|
|
212
|
+
id: "findCardinalOfCartesianProductOfFiniteSets",
|
|
213
|
+
connector: "=",
|
|
214
|
+
isSingleStep: true,
|
|
215
|
+
label: "Donner le cardinal du produit cartésien de deux ensembles",
|
|
216
|
+
generator: (nb) => getDistinctQuestions(getFindCardinalOfCartesianProductOfFiniteSetsQuestion, nb),
|
|
217
|
+
qcmTimer: 60,
|
|
218
|
+
freeTimer: 60,
|
|
219
|
+
getPropositions,
|
|
220
|
+
isAnswerValid,
|
|
221
|
+
subject: "Mathématiques",
|
|
222
|
+
hasHintAndCorrection: true,
|
|
223
|
+
getQuestionFromIdentifiers,
|
|
224
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Exercise } from "../../../../exercises/exercise.js";
|
|
2
|
+
import { NodeIdentifiers } from "../../../../tree/nodes/nodeConstructor.js";
|
|
3
|
+
type Situation = {
|
|
4
|
+
strInstruction: string;
|
|
5
|
+
strCorrection: string;
|
|
6
|
+
dictSets: Record<string, {
|
|
7
|
+
cardinal: number;
|
|
8
|
+
strInjected: string;
|
|
9
|
+
strExplain: string;
|
|
10
|
+
}>;
|
|
11
|
+
nodeIdsCardinal: NodeIdentifiers;
|
|
12
|
+
};
|
|
13
|
+
type Identifiers = {
|
|
14
|
+
situation: Situation;
|
|
15
|
+
};
|
|
16
|
+
export declare const findCardinalOfCartesianProductOfFiniteSetsFromSituation: Exercise<Identifiers>;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=findCardinalOfCartesianProductOfFiniteSetsFromSituation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findCardinalOfCartesianProductOfFiniteSetsFromSituation.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/sets/cartesianProduct/findCardinalOfCartesianProductOfFiniteSetsFromSituation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAgBT,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAEL,eAAe,EAChB,MAAM,qCAAqC,CAAC;AAuE7C,KAAK,SAAS,GAAG;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CACd,MAAM,EACN;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAC9D,CAAC;IACF,eAAe,EAAE,eAAe,CAAC;CAClC,CAAC;AAqDF,KAAK,WAAW,GAAG;IACjB,SAAS,EAAE,SAAS,CAAC;CACtB,CAAC;AA6IF,eAAO,MAAM,uDAAuD,EAAE,QAAQ,CAAC,WAAW,CAmBvF,CAAC"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { addValidProp, propWhile, shuffleProps, tryToAddWrongProp, } from "../../../../exercises/exercise.js";
|
|
2
|
+
import { getDistinctQuestions } from "../../../../exercises/utils/getDistinctQuestions.js";
|
|
3
|
+
import { handleVEAError } from "../../../../utils/errors/handleVEAError.js";
|
|
4
|
+
import { NodeConstructor, } from "../../../../tree/nodes/nodeConstructor.js";
|
|
5
|
+
import { random, randomMany } from "../../../../utils/alea/random.js";
|
|
6
|
+
import { coinFlip } from "../../../../utils/alea/coinFlip.js";
|
|
7
|
+
import { multiply } from "../../../../tree/nodes/operators/multiplyNode.js";
|
|
8
|
+
import { numberVEA } from "../../../../exercises/vea/numberVEA.js";
|
|
9
|
+
import { randint } from "../../../../math/utils/random/randint.js";
|
|
10
|
+
import { joinanded } from "../../../../utils/strings/joinanded.js";
|
|
11
|
+
const situationTemplates = [
|
|
12
|
+
{
|
|
13
|
+
strInstruction: "Un coffret contient ${shapes}, ${colors}, et ${sizes}. Combien de perles distinctes existe-t-il ?",
|
|
14
|
+
strCorrection: `\${shapes.explain}
|
|
15
|
+
\${colors.explain}
|
|
16
|
+
\${sizes.explain}
|
|
17
|
+
Le nombre de perles distinctes est donc $\${cardinal}$.`,
|
|
18
|
+
dictFuncs: {
|
|
19
|
+
shapes: () => {
|
|
20
|
+
const pool = ["rondes", "ovales", "carrées", "cylindriques"];
|
|
21
|
+
const cardinal = randint(1, pool.length);
|
|
22
|
+
const arrStr = randomMany(pool, cardinal);
|
|
23
|
+
return {
|
|
24
|
+
cardinal,
|
|
25
|
+
strInjected: `des perles ${joinanded(arrStr, ", ", " et ")}`,
|
|
26
|
+
strExplain: cardinal === 1
|
|
27
|
+
? `Il y a une seule forme.`
|
|
28
|
+
: `Il y a $${cardinal}$ formes différentes.`,
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
colors: () => {
|
|
32
|
+
const pool = ["rouges", "vertes", "bleues", "jaunes"];
|
|
33
|
+
const cardinal = randint(1, pool.length);
|
|
34
|
+
const arrStr = randomMany(pool, cardinal);
|
|
35
|
+
return {
|
|
36
|
+
cardinal,
|
|
37
|
+
strInjected: `des perles ${joinanded(arrStr, ", ", " et ")}`,
|
|
38
|
+
strExplain: cardinal === 1
|
|
39
|
+
? `Il y a une seule couleur.`
|
|
40
|
+
: `Il y a $${cardinal}$ couleurs différentes.`,
|
|
41
|
+
};
|
|
42
|
+
},
|
|
43
|
+
sizes: () => {
|
|
44
|
+
const cardinal = randint(2, 7);
|
|
45
|
+
return {
|
|
46
|
+
cardinal,
|
|
47
|
+
strInjected: cardinal === 1
|
|
48
|
+
? `une même taille pour toutes les perles.`
|
|
49
|
+
: `$${cardinal}$ tailles de perles différentes`,
|
|
50
|
+
strExplain: cardinal === 1
|
|
51
|
+
? `Il y a une seule taille.`
|
|
52
|
+
: `Il y a $${cardinal}$ tailles différentes.`,
|
|
53
|
+
};
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
class SituationConstructor {
|
|
59
|
+
static randomSituationFromTemplate(situationTemplate) {
|
|
60
|
+
const dictSets = Object.entries(situationTemplate.dictFuncs).reduce((acc, [key, func]) => {
|
|
61
|
+
acc[key] = func();
|
|
62
|
+
return acc;
|
|
63
|
+
}, {});
|
|
64
|
+
const { strInstruction, strCorrection: strCorrectionIncomplete, nodeCardinal, } = Object.entries(dictSets).reduce((acc, [key, miniDict]) => {
|
|
65
|
+
acc.strInstruction = acc.strInstruction.replace(`\${${key}}`, miniDict.strInjected);
|
|
66
|
+
acc.strCorrection = acc.strCorrection.replace(`\${${key}.explain}`, miniDict.strExplain);
|
|
67
|
+
acc.nodeCardinal = acc.nodeCardinal
|
|
68
|
+
? multiply(acc.nodeCardinal, miniDict.cardinal)
|
|
69
|
+
: miniDict.cardinal.toTree();
|
|
70
|
+
return acc;
|
|
71
|
+
}, {
|
|
72
|
+
strInstruction: situationTemplate.strInstruction,
|
|
73
|
+
strCorrection: situationTemplate.strCorrection,
|
|
74
|
+
nodeCardinal: undefined,
|
|
75
|
+
});
|
|
76
|
+
const strCorrection = strCorrectionIncomplete.replace(`\${cardinal}`, `${nodeCardinal.toTex()} = ${nodeCardinal
|
|
77
|
+
.simplify({ towardsDistribute: true })
|
|
78
|
+
.toTex()}`);
|
|
79
|
+
return {
|
|
80
|
+
nodeIdsCardinal: nodeCardinal.toIdentifiers(),
|
|
81
|
+
strInstruction,
|
|
82
|
+
strCorrection,
|
|
83
|
+
dictSets,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const getInstruction = (identifiers) => {
|
|
88
|
+
const { situation: { strInstruction }, } = identifiers;
|
|
89
|
+
return strInstruction;
|
|
90
|
+
};
|
|
91
|
+
const getAnswerNode = (identifiers) => {
|
|
92
|
+
const { situation: { nodeIdsCardinal }, } = identifiers;
|
|
93
|
+
const nodeCardinal = NodeConstructor.fromIdentifiers(nodeIdsCardinal);
|
|
94
|
+
return nodeCardinal;
|
|
95
|
+
};
|
|
96
|
+
const getAnswer = (identifiers) => {
|
|
97
|
+
return getAnswerNode(identifiers)
|
|
98
|
+
.simplify({ towardsDistribute: true })
|
|
99
|
+
.toTex();
|
|
100
|
+
};
|
|
101
|
+
const getHint = () => {
|
|
102
|
+
return `Le cardinal d'un ensemble fini est le nombre d'éléments de l'ensemble.
|
|
103
|
+
|
|
104
|
+
On va prendre un exemple avec des cartes à jouer.
|
|
105
|
+
Chaque carte peut être soit Valet, soit Dame, soit Roi.
|
|
106
|
+
Chaque carte peut être soit Pique, soit Coeur.
|
|
107
|
+
|
|
108
|
+
Voici toutes les cartes possibles :
|
|
109
|
+
|
|
110
|
+
$$
|
|
111
|
+
(\\text{Valet},\\text{Pique}),(\\text{Valet},\\text{Coeur})
|
|
112
|
+
$$
|
|
113
|
+
|
|
114
|
+
$$
|
|
115
|
+
(\\text{Dame},\\text{Pique}),(\\text{Dame},\\text{Coeur})
|
|
116
|
+
$$
|
|
117
|
+
|
|
118
|
+
$$
|
|
119
|
+
(\\text{Roi},\\text{Pique}),(\\text{Roi},\\text{Coeur})
|
|
120
|
+
$$
|
|
121
|
+
|
|
122
|
+
Il y en a $3\\times2=6$.`;
|
|
123
|
+
};
|
|
124
|
+
const getCorrection = (identifiers) => {
|
|
125
|
+
const { situation: { strCorrection }, } = identifiers;
|
|
126
|
+
return strCorrection;
|
|
127
|
+
};
|
|
128
|
+
const getPropositions = (n, { answer, ...identifiers }) => {
|
|
129
|
+
const { situation: { dictSets }, } = identifiers;
|
|
130
|
+
const propositions = [];
|
|
131
|
+
addValidProp(propositions, answer);
|
|
132
|
+
const arrSubCardinal = Object.values(dictSets).map(({ cardinal }) => cardinal);
|
|
133
|
+
//student: add
|
|
134
|
+
{
|
|
135
|
+
const cardinalWrong = arrSubCardinal.reduce((acc, x) => acc + x, 0);
|
|
136
|
+
tryToAddWrongProp(propositions, cardinalWrong.frenchify());
|
|
137
|
+
}
|
|
138
|
+
//student: max(dictSets.cardinal)
|
|
139
|
+
{
|
|
140
|
+
const cardinalWrong = arrSubCardinal.reduce((acc, x) => Math.max(acc, x), 0);
|
|
141
|
+
tryToAddWrongProp(propositions, cardinalWrong.frenchify());
|
|
142
|
+
}
|
|
143
|
+
propWhile(propositions, n, () => {
|
|
144
|
+
//filler: around answer wrt multiplication tables
|
|
145
|
+
{
|
|
146
|
+
const indexWrong = randint(0, arrSubCardinal.length);
|
|
147
|
+
const arrSubCardinalWrong = arrSubCardinal.map((v, i) => i === indexWrong ? (v === 1 ? v + 1 : v + (coinFlip() ? -1 : 1)) : v);
|
|
148
|
+
const cardinalWrong = arrSubCardinalWrong.reduce((acc, x) => acc * x, 1);
|
|
149
|
+
tryToAddWrongProp(propositions, cardinalWrong.frenchify());
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
return shuffleProps(propositions, n);
|
|
153
|
+
};
|
|
154
|
+
const getKeys = () => {
|
|
155
|
+
return [];
|
|
156
|
+
};
|
|
157
|
+
const isAnswerValid = (ans, { answer }) => {
|
|
158
|
+
try {
|
|
159
|
+
return numberVEA(ans, answer);
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
return handleVEAError(err);
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
const getFindCardinalOfCartesianProductOfFiniteSetsFromSituationQuestion = () => {
|
|
166
|
+
const situationTemplate = random(situationTemplates);
|
|
167
|
+
const situation = SituationConstructor.randomSituationFromTemplate(situationTemplate);
|
|
168
|
+
const identifiers = {
|
|
169
|
+
situation,
|
|
170
|
+
};
|
|
171
|
+
return getQuestionFromIdentifiers(identifiers);
|
|
172
|
+
};
|
|
173
|
+
const getQuestionFromIdentifiers = (identifiers) => {
|
|
174
|
+
const question = {
|
|
175
|
+
instruction: getInstruction(identifiers),
|
|
176
|
+
answer: getAnswer(identifiers),
|
|
177
|
+
keys: getKeys(identifiers),
|
|
178
|
+
answerFormat: "tex",
|
|
179
|
+
identifiers,
|
|
180
|
+
hint: getHint(identifiers),
|
|
181
|
+
correction: getCorrection(identifiers),
|
|
182
|
+
};
|
|
183
|
+
return question;
|
|
184
|
+
};
|
|
185
|
+
export const findCardinalOfCartesianProductOfFiniteSetsFromSituation = {
|
|
186
|
+
id: "findCardinalOfCartesianProductOfFiniteSetsFromSituation",
|
|
187
|
+
connector: "=",
|
|
188
|
+
isSingleStep: true,
|
|
189
|
+
label: "Donner le cardinal d'un ensemble produit cartésien défini par une situation",
|
|
190
|
+
generator: (nb) => getDistinctQuestions(getFindCardinalOfCartesianProductOfFiniteSetsFromSituationQuestion, nb),
|
|
191
|
+
qcmTimer: 60,
|
|
192
|
+
freeTimer: 60,
|
|
193
|
+
getPropositions,
|
|
194
|
+
isAnswerValid,
|
|
195
|
+
subject: "Mathématiques",
|
|
196
|
+
hasHintAndCorrection: true,
|
|
197
|
+
getQuestionFromIdentifiers,
|
|
198
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Exercise } from "../../../../exercises/exercise.js";
|
|
2
|
+
import { NodeIdentifiers } from "../../../../tree/nodes/nodeConstructor.js";
|
|
3
|
+
type Identifiers = {
|
|
4
|
+
strDescriptionE: string;
|
|
5
|
+
nodeIdsSetE: NodeIdentifiers;
|
|
6
|
+
k: number;
|
|
7
|
+
};
|
|
8
|
+
export declare const findCardinalOfPowEK: Exercise<Identifiers>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=findCardinalOfPowEK.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findCardinalOfPowEK.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/sets/cartesianProduct/findCardinalOfPowEK.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAeT,MAAM,6BAA6B,CAAC;AAIrC,OAAO,EAEL,eAAe,EAChB,MAAM,qCAAqC,CAAC;AAsH7C,KAAK,WAAW,GAAG;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,eAAe,CAAC;IAC7B,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAqKF,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,WAAW,CAerD,CAAC"}
|