math-exercises 3.0.198 → 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/calculLitteral/equation/exp/expOfTrinomEquals1Equation.d.ts.map +1 -1
- package/lib/exercises/math/calculLitteral/equation/exp/expOfTrinomEquals1Equation.js +3 -0
- package/lib/exercises/math/calculLitteral/inequations/firstDegreeInequationsType3.d.ts.map +1 -1
- package/lib/exercises/math/calculLitteral/inequations/firstDegreeInequationsType3.js +58 -30
- 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/complex/addComplex.d.ts.map +1 -1
- package/lib/exercises/math/complex/addComplex.js +53 -7
- package/lib/exercises/math/complex/conjugateComplex.d.ts.map +1 -1
- package/lib/exercises/math/complex/conjugateComplex.js +48 -7
- package/lib/exercises/math/complex/mutiplyComplex.d.ts.map +1 -1
- package/lib/exercises/math/complex/mutiplyComplex.js +51 -18
- package/lib/exercises/math/complex/reAndIm.d.ts.map +1 -1
- package/lib/exercises/math/complex/reAndIm.js +35 -4
- 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/cosSecondDegreeDerivative.d.ts.map +1 -1
- package/lib/exercises/math/derivation/derivative/trigo/cosSecondDegreeDerivative.js +47 -3
- 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/functions/exponential/sign/expFunctionBasicSign.d.ts.map +1 -1
- package/lib/exercises/math/functions/exponential/sign/expFunctionBasicSign.js +3 -0
- package/lib/exercises/math/functions/sign/affineProductSign.d.ts.map +1 -1
- package/lib/exercises/math/functions/sign/affineProductSign.js +0 -4
- 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/spaceGeometry/vectors/spaceVectorLinearCombinationCoords.d.ts.map +1 -1
- 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 +28 -2
- package/lib/tests/pdfExo.test.js +2 -2
- package/lib/tests/pdfs/buildPDFForExercise.d.ts.map +1 -1
- package/lib/tests/pdfs/buildPDFForExercise.js +6 -0
- package/lib/tests/pdfs/quizPdfPreambule.d.ts.map +1 -1
- package/lib/tests/pdfs/quizPdfPreambule.js +1 -0
- package/lib/tests/pdfs/treeDiagramToLatex.d.ts +15 -0
- package/lib/tests/pdfs/treeDiagramToLatex.d.ts.map +1 -0
- package/lib/tests/pdfs/treeDiagramToLatex.js +49 -0
- package/lib/tests/questionTest.d.ts.map +1 -1
- package/lib/tests/questionTest.js +19 -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
package/lib/exercises/math/sets/cartesianProduct/proposeElementInCartesianProductOfFiniteSets.js
ADDED
|
@@ -0,0 +1,291 @@
|
|
|
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 { parseAlgebraic } from "../../../../tree/parsers/latexParser.js";
|
|
6
|
+
import { handleVEAError } from "../../../../utils/errors/handleVEAError.js";
|
|
7
|
+
import { NodeConstructor, } from "../../../../tree/nodes/nodeConstructor.js";
|
|
8
|
+
import { DiscreteSetNode } from "../../../../tree/nodes/sets/discreteSetNode.js";
|
|
9
|
+
import { Tuple } from "../../../../math/sets/tuple.js";
|
|
10
|
+
import { isVariableNode, VariableNode, } from "../../../../tree/nodes/variables/variableNode.js";
|
|
11
|
+
import { NodeComparator } from "../../../../tree/utilities/nodeComparator.js";
|
|
12
|
+
import { random } from "../../../../utils/alea/random.js";
|
|
13
|
+
import { discreteSetCartesianProduct, discreteSetSubstract, } from "../../../../math/sets/setOperations.js";
|
|
14
|
+
import { coinFlip } from "../../../../utils/alea/coinFlip.js";
|
|
15
|
+
/*
|
|
16
|
+
This toTex() function supports discreteSetNodes with variableNodes inside (this won't create unknown command \\lbracem if m is the first element)
|
|
17
|
+
*/
|
|
18
|
+
const discreteSetNodeToTex = (discreteSetNode) => {
|
|
19
|
+
return `\\lbrace ${discreteSetNode.elements
|
|
20
|
+
.map((el) => el.toTex())
|
|
21
|
+
.join(";")} \\rbrace`;
|
|
22
|
+
};
|
|
23
|
+
const getInstruction = (identifiers) => {
|
|
24
|
+
const { nodeIdsSetA, nodeIdsSetB, isAskedACrossB } = identifiers;
|
|
25
|
+
const [nodeSetA, nodeSetB] = [nodeIdsSetA, nodeIdsSetB].map((nodeIds) => NodeConstructor.fromIdentifiers(nodeIds));
|
|
26
|
+
const texAskedSet = isAskedACrossB ? `A \\times B` : `B \\times A`;
|
|
27
|
+
return `Soient deux ensembles :
|
|
28
|
+
|
|
29
|
+
${alignTex([
|
|
30
|
+
["A", nodeSetA],
|
|
31
|
+
["B", nodeSetB],
|
|
32
|
+
].map(([letter, nodeSet]) => [letter, "=", discreteSetNodeToTex(nodeSet)]))}
|
|
33
|
+
|
|
34
|
+
Donner un élément appartenant à $${texAskedSet}$.`;
|
|
35
|
+
};
|
|
36
|
+
const getAnswerStuff = (identifiers) => {
|
|
37
|
+
const { nodeIdsSetA, nodeIdsSetB, isAskedACrossB } = identifiers;
|
|
38
|
+
const [nodeSetA, nodeSetB] = [nodeIdsSetA, nodeIdsSetB].map((nodeIds) => NodeConstructor.fromIdentifiers(nodeIds));
|
|
39
|
+
const [nodeSetF, nodeSetS] = isAskedACrossB
|
|
40
|
+
? [nodeSetA, nodeSetB]
|
|
41
|
+
: [nodeSetB, nodeSetA];
|
|
42
|
+
const arrTuple = discreteSetCartesianProduct(nodeSetF, nodeSetS);
|
|
43
|
+
return { arrTuple };
|
|
44
|
+
};
|
|
45
|
+
const getAnswer = (identifiers) => {
|
|
46
|
+
const { arrTuple } = getAnswerStuff(identifiers);
|
|
47
|
+
return arrTuple[0].toTex();
|
|
48
|
+
};
|
|
49
|
+
const getHint = () => {
|
|
50
|
+
return `Soient deux ensembles $C$ et $D$.
|
|
51
|
+
Les éléments de $D \\times C$ sont tous les couples que l'on peut former
|
|
52
|
+
avec comme premier élément un élement de $D$, et comme deuxième élément un élément de $C$.
|
|
53
|
+
|
|
54
|
+
Voici un exemple :
|
|
55
|
+
|
|
56
|
+
$$
|
|
57
|
+
C = \\lbrace 32, 42, 52 \\rbrace
|
|
58
|
+
$$
|
|
59
|
+
|
|
60
|
+
$$
|
|
61
|
+
D = \\lbrace u, v \\rbrace
|
|
62
|
+
$$
|
|
63
|
+
|
|
64
|
+
Voici les couples appartenant à $D \\times C$ :
|
|
65
|
+
|
|
66
|
+
$$
|
|
67
|
+
(u,32),(u,42),(u,52),
|
|
68
|
+
$$
|
|
69
|
+
|
|
70
|
+
$$
|
|
71
|
+
(v,32),(v,42),(v,52)
|
|
72
|
+
$$
|
|
73
|
+
|
|
74
|
+
`;
|
|
75
|
+
};
|
|
76
|
+
const getCorrection = (identifiers) => {
|
|
77
|
+
const { isAskedACrossB } = identifiers;
|
|
78
|
+
const [texSetF, texSetS] = isAskedACrossB ? ["A", "B"] : ["B", "A"];
|
|
79
|
+
const texAskedSet = `${texSetF} \\times ${texSetS}`;
|
|
80
|
+
const arrTuple = getAnswerStuff(identifiers).arrTuple;
|
|
81
|
+
return `Les éléments de $${texAskedSet}$ sont tous les couples que l'on peut former
|
|
82
|
+
avec comme premier élément un élement de $${texSetF}$, et comme deuxième élément un élément de $${texSetS}$.
|
|
83
|
+
|
|
84
|
+
Voici tous les éléments de $${texAskedSet}$ :
|
|
85
|
+
|
|
86
|
+
${alignTex(arrTuple.map((tuple) => [tuple.toTex()]))}
|
|
87
|
+
|
|
88
|
+
`;
|
|
89
|
+
};
|
|
90
|
+
const getPropositions = (n, { answer, ...identifiers }) => {
|
|
91
|
+
const { items } = identifiers;
|
|
92
|
+
const propositions = [];
|
|
93
|
+
items.map(({ tex, isValid }) => {
|
|
94
|
+
if (isValid) {
|
|
95
|
+
addValidProp(propositions, tex);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
tryToAddWrongProp(propositions, tex);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
return shuffleProps(propositions, n);
|
|
102
|
+
};
|
|
103
|
+
const getKeys = (identifiers) => {
|
|
104
|
+
const { nodeIdsSetA, nodeIdsSetB } = identifiers;
|
|
105
|
+
const [nodeSetA, nodeSetB] = [nodeIdsSetA, nodeIdsSetB].map((nodeIds) => NodeConstructor.fromIdentifiers(nodeIds));
|
|
106
|
+
const arrVarNode = [...nodeSetA.elements, ...nodeSetB.elements].filter((node) => isVariableNode(node));
|
|
107
|
+
return [
|
|
108
|
+
"semicolon",
|
|
109
|
+
...arrVarNode.map((varNode) => {
|
|
110
|
+
const tex = varNode.toTex();
|
|
111
|
+
return {
|
|
112
|
+
id: "custom",
|
|
113
|
+
label: tex,
|
|
114
|
+
labelType: "tex",
|
|
115
|
+
mathfieldInstructions: {
|
|
116
|
+
method: "write",
|
|
117
|
+
content: tex,
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}),
|
|
121
|
+
];
|
|
122
|
+
};
|
|
123
|
+
const isAnswerValid = (ans, { answer, ...identifiers }) => {
|
|
124
|
+
const { nodeIdsSetA, nodeIdsSetB, isAskedACrossB } = identifiers;
|
|
125
|
+
const [nodeSetA, nodeSetB] = [nodeIdsSetA, nodeIdsSetB].map((nodeIds) => NodeConstructor.fromIdentifiers(nodeIds));
|
|
126
|
+
const [nodeSetF, nodeSetS] = isAskedACrossB
|
|
127
|
+
? [nodeSetA, nodeSetB]
|
|
128
|
+
: [nodeSetB, nodeSetA];
|
|
129
|
+
function matchGroups(regex, input) {
|
|
130
|
+
const match = regex.exec(input);
|
|
131
|
+
return match?.groups || undefined;
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
const tupleAns = (() => {
|
|
135
|
+
const ansParts = matchGroups(/^\\left\((?<strOne>.*(?!;$));(?<strTwo>.*)\\right\)$/, ans);
|
|
136
|
+
if (ansParts === undefined) {
|
|
137
|
+
throw new Error("Parsing error: ans is not a tuple");
|
|
138
|
+
}
|
|
139
|
+
const { strOne, strTwo } = ansParts;
|
|
140
|
+
const [nodeOne, nodeTwo] = [strOne, strTwo].map((str) => {
|
|
141
|
+
try {
|
|
142
|
+
return parseAlgebraic(str);
|
|
143
|
+
}
|
|
144
|
+
catch (_) {
|
|
145
|
+
return new VariableNode(str);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
return new Tuple([nodeOne, nodeTwo]);
|
|
149
|
+
})();
|
|
150
|
+
return NodeComparator.isTupleInCartesianProductOfDiscreteSets(tupleAns, [
|
|
151
|
+
nodeSetF,
|
|
152
|
+
nodeSetS,
|
|
153
|
+
]);
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
return handleVEAError(err);
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
const getProposeElementInCartesianProductOfFiniteSetsQuestion = () => {
|
|
160
|
+
const poolNumberNode = [...Array(20).keys()]
|
|
161
|
+
.map((i) => i * 2)
|
|
162
|
+
.map((v) => v.toTree());
|
|
163
|
+
const poolVarNode1 = ["c", "d", "k"].map((letter) => new VariableNode(letter));
|
|
164
|
+
const poolVarNode2 = ["\\alpha", "\\beta", "\\gamma", "\\delta"].map((letter) => new VariableNode(letter));
|
|
165
|
+
function createRandomSetNode(funcCreateElem, nbElem) {
|
|
166
|
+
const arrNode = shuffle([...Array(nbElem).keys()].reduce((acc, i) => {
|
|
167
|
+
acc = [...acc, funcCreateElem(i, acc)];
|
|
168
|
+
return acc;
|
|
169
|
+
}, []));
|
|
170
|
+
return new DiscreteSetNode(arrNode);
|
|
171
|
+
}
|
|
172
|
+
const [nbElemA, nbElemB] = random([
|
|
173
|
+
[2, 2],
|
|
174
|
+
[2, 3],
|
|
175
|
+
[3, 2],
|
|
176
|
+
]);
|
|
177
|
+
const poolCommon = random([
|
|
178
|
+
poolNumberNode,
|
|
179
|
+
poolVarNode1,
|
|
180
|
+
poolVarNode2,
|
|
181
|
+
]);
|
|
182
|
+
const poolAOnly = [
|
|
183
|
+
new VariableNode("b"),
|
|
184
|
+
...[...Array(20).keys()].map((i) => i * 2 + 1).map((v) => v.toTree()),
|
|
185
|
+
];
|
|
186
|
+
const poolBOnly = ["a", "m", "n"].map((letter) => new VariableNode(letter));
|
|
187
|
+
function* genFuncElemA() {
|
|
188
|
+
yield* shuffle(poolCommon);
|
|
189
|
+
return "Done";
|
|
190
|
+
}
|
|
191
|
+
function* genFuncElemB() {
|
|
192
|
+
yield* shuffle(poolCommon);
|
|
193
|
+
return "Done";
|
|
194
|
+
}
|
|
195
|
+
const [generateElemA, generateElemB] = [genFuncElemA(), genFuncElemB()];
|
|
196
|
+
//ensure A\B is not empty
|
|
197
|
+
const nodeSetA = createRandomSetNode((i) => {
|
|
198
|
+
if (i === nbElemA - 1) {
|
|
199
|
+
return random(poolAOnly);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
return generateElemA.next().value;
|
|
203
|
+
}
|
|
204
|
+
}, nbElemA);
|
|
205
|
+
//ensure B\A is not empty
|
|
206
|
+
const nodeSetB = createRandomSetNode((i, _arrPrevious) => {
|
|
207
|
+
if (i === nbElemB - 1) {
|
|
208
|
+
return random(poolBOnly);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
return generateElemB.next().value;
|
|
212
|
+
}
|
|
213
|
+
}, nbElemB);
|
|
214
|
+
const isAskedACrossB = coinFlip();
|
|
215
|
+
const items = (() => {
|
|
216
|
+
const [nodeSetF, nodeSetS] = isAskedACrossB
|
|
217
|
+
? [nodeSetA, nodeSetB]
|
|
218
|
+
: [nodeSetB, nodeSetA];
|
|
219
|
+
const _nbValid = 1;
|
|
220
|
+
const nodeSetFMinusS = discreteSetSubstract(nodeSetF, nodeSetS);
|
|
221
|
+
const nodeSetSMinusF = discreteSetSubstract(nodeSetS, nodeSetF);
|
|
222
|
+
const items = [
|
|
223
|
+
//valid: in F x S
|
|
224
|
+
(() => {
|
|
225
|
+
const tuple = random(discreteSetCartesianProduct(nodeSetF, nodeSetS));
|
|
226
|
+
return {
|
|
227
|
+
tex: tuple.toTex(),
|
|
228
|
+
isValid: true,
|
|
229
|
+
};
|
|
230
|
+
})(),
|
|
231
|
+
//invalid: in F x (F\S)
|
|
232
|
+
(() => {
|
|
233
|
+
const tuple = random(discreteSetCartesianProduct(nodeSetF, nodeSetFMinusS));
|
|
234
|
+
return {
|
|
235
|
+
tex: tuple.toTex(),
|
|
236
|
+
isValid: false,
|
|
237
|
+
};
|
|
238
|
+
})(),
|
|
239
|
+
//invalid: in (S\F) x S
|
|
240
|
+
(() => {
|
|
241
|
+
const tuple = random(discreteSetCartesianProduct(nodeSetSMinusF, nodeSetS));
|
|
242
|
+
return {
|
|
243
|
+
tex: tuple.toTex(),
|
|
244
|
+
isValid: false,
|
|
245
|
+
};
|
|
246
|
+
})(),
|
|
247
|
+
//invalid: in (S\F) x F
|
|
248
|
+
(() => {
|
|
249
|
+
const tuple = random(discreteSetCartesianProduct(nodeSetSMinusF, nodeSetF));
|
|
250
|
+
return {
|
|
251
|
+
tex: tuple.toTex(),
|
|
252
|
+
isValid: false,
|
|
253
|
+
};
|
|
254
|
+
})(),
|
|
255
|
+
];
|
|
256
|
+
return items;
|
|
257
|
+
})();
|
|
258
|
+
const identifiers = {
|
|
259
|
+
nodeIdsSetA: nodeSetA.toIdentifiers(),
|
|
260
|
+
nodeIdsSetB: nodeSetB.toIdentifiers(),
|
|
261
|
+
isAskedACrossB,
|
|
262
|
+
items,
|
|
263
|
+
};
|
|
264
|
+
return getQuestionFromIdentifiers(identifiers);
|
|
265
|
+
};
|
|
266
|
+
const getQuestionFromIdentifiers = (identifiers) => {
|
|
267
|
+
const question = {
|
|
268
|
+
instruction: getInstruction(identifiers),
|
|
269
|
+
answer: getAnswer(identifiers),
|
|
270
|
+
keys: getKeys(identifiers),
|
|
271
|
+
answerFormat: "tex",
|
|
272
|
+
identifiers,
|
|
273
|
+
hint: getHint(identifiers),
|
|
274
|
+
correction: getCorrection(identifiers),
|
|
275
|
+
};
|
|
276
|
+
return question;
|
|
277
|
+
};
|
|
278
|
+
export const proposeElementInCartesianProductOfFiniteSets = {
|
|
279
|
+
id: "proposeElementInCartesianProductOfFiniteSets",
|
|
280
|
+
connector: "=",
|
|
281
|
+
isSingleStep: true,
|
|
282
|
+
label: "Proposer un élément appartenant au produit cartésien de deux ensembles",
|
|
283
|
+
generator: (nb) => getDistinctQuestions(getProposeElementInCartesianProductOfFiniteSetsQuestion, nb),
|
|
284
|
+
qcmTimer: 60,
|
|
285
|
+
freeTimer: 60,
|
|
286
|
+
getPropositions,
|
|
287
|
+
isAnswerValid,
|
|
288
|
+
subject: "Mathématiques",
|
|
289
|
+
hasHintAndCorrection: true,
|
|
290
|
+
getQuestionFromIdentifiers,
|
|
291
|
+
};
|
|
@@ -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 proposeElementInPowEK: Exercise<Identifiers>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=proposeElementInPowEK.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposeElementInPowEK.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/sets/cartesianProduct/proposeElementInPowEK.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAeT,MAAM,6BAA6B,CAAC;AAKrC,OAAO,EAEL,eAAe,EAChB,MAAM,qCAAqC,CAAC;AAoH7C,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;AAmOF,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,WAAW,CAcvD,CAAC"}
|
|
@@ -0,0 +1,274 @@
|
|
|
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 { parseAlgebraic } from "../../../../tree/parsers/latexParser.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 { Tuple } from "../../../../math/sets/tuple.js";
|
|
9
|
+
import { isVariableNode, VariableNode, } from "../../../../tree/nodes/variables/variableNode.js";
|
|
10
|
+
import { NodeComparator } from "../../../../tree/utilities/nodeComparator.js";
|
|
11
|
+
import { randomTupleInDiscreteSetPower } from "../../../../math/sets/setOperations.js";
|
|
12
|
+
import { randint } from "../../../../math/utils/random/randint.js";
|
|
13
|
+
import { shuffle } from "../../../../utils/alea/shuffle.js";
|
|
14
|
+
import { coinFlip } from "../../../../utils/alea/coinFlip.js";
|
|
15
|
+
import { probaLawFlip } from "../../../../utils/alea/probaLawFlip.js";
|
|
16
|
+
import { randomMany } from "../../../../utils/alea/random.js";
|
|
17
|
+
const randomDiscreteSetIdsAndDescription = () => {
|
|
18
|
+
return probaLawFlip([
|
|
19
|
+
[
|
|
20
|
+
(() => {
|
|
21
|
+
const nbElements = randint(2, 5);
|
|
22
|
+
const arrLetter = shuffle(["a", "b", "c", "d"]).slice(0, nbElements);
|
|
23
|
+
const arrNode = arrLetter.map((letter) => new VariableNode(letter));
|
|
24
|
+
const nodeSetE = new DiscreteSetNode(arrNode);
|
|
25
|
+
return {
|
|
26
|
+
nodeIdsSetE: nodeSetE.toIdentifiers(),
|
|
27
|
+
strDescriptionE: `l'ensemble $${discreteSetNodeToTex(nodeSetE)}$`,
|
|
28
|
+
};
|
|
29
|
+
})(),
|
|
30
|
+
0.3,
|
|
31
|
+
],
|
|
32
|
+
[
|
|
33
|
+
(() => {
|
|
34
|
+
const nbElements = randint(2, 6);
|
|
35
|
+
const arrNumber = randomMany([...Array(9).keys()].map((i) => i + 1), nbElements);
|
|
36
|
+
const arrNode = shuffle(arrNumber.map((v) => v.toTree()));
|
|
37
|
+
const nodeSetE = new DiscreteSetNode(arrNode);
|
|
38
|
+
return {
|
|
39
|
+
nodeIdsSetE: nodeSetE.toIdentifiers(),
|
|
40
|
+
strDescriptionE: `l'ensemble $${discreteSetNodeToTex(nodeSetE)}$`,
|
|
41
|
+
};
|
|
42
|
+
})(),
|
|
43
|
+
0.3,
|
|
44
|
+
],
|
|
45
|
+
[
|
|
46
|
+
(() => {
|
|
47
|
+
const [boundLowRaw, boundHighRaw] = [randint(2, 8), randint(13, 19)];
|
|
48
|
+
const [isBoundLowIncluded, isBoundHighIncluded] = [0, 1].map(() => coinFlip());
|
|
49
|
+
const boundLow = boundLowRaw + (isBoundLowIncluded ? 0 : 1);
|
|
50
|
+
const boundHigh = boundHighRaw + (isBoundHighIncluded ? 0 : -1);
|
|
51
|
+
const arrNumber = [...Array(boundHigh - boundLow + 1).keys()].map((i) => i + boundLow);
|
|
52
|
+
const arrNode = arrNumber.map((v) => v.toTree());
|
|
53
|
+
const nodeSetE = new DiscreteSetNode(arrNode);
|
|
54
|
+
return {
|
|
55
|
+
nodeIdsSetE: nodeSetE.toIdentifiers(),
|
|
56
|
+
strDescriptionE: `l'ensemble des entiers compris entre $${boundLow}$ ${isBoundLowIncluded ? "inclus" : "exclu"} et $${boundHigh}$ ${isBoundHighIncluded ? "inclus" : "exclu"}`,
|
|
57
|
+
};
|
|
58
|
+
})(),
|
|
59
|
+
0.2,
|
|
60
|
+
],
|
|
61
|
+
[
|
|
62
|
+
(() => {
|
|
63
|
+
const isFilterEven = coinFlip();
|
|
64
|
+
const [boundLowRaw, boundHighRaw] = [randint(2, 8), randint(13, 19)];
|
|
65
|
+
const [isBoundLowIncluded, isBoundHighIncluded] = [0, 1].map(() => coinFlip());
|
|
66
|
+
const boundLow = boundLowRaw + (isBoundLowIncluded ? 0 : 1);
|
|
67
|
+
const boundHigh = boundHighRaw + (isBoundHighIncluded ? 0 : -1);
|
|
68
|
+
const arrNumber = [...Array(boundHigh - boundLow + 1).keys()]
|
|
69
|
+
.map((i) => i + boundLow)
|
|
70
|
+
.filter((v) => (isFilterEven ? v % 2 === 0 : v % 2 === 1));
|
|
71
|
+
const arrNode = arrNumber.map((v) => v.toTree());
|
|
72
|
+
const nodeSetE = new DiscreteSetNode(arrNode);
|
|
73
|
+
return {
|
|
74
|
+
nodeIdsSetE: nodeSetE.toIdentifiers(),
|
|
75
|
+
strDescriptionE: `l'ensemble des entiers ${isFilterEven ? "pairs" : "impairs"} compris entre $${boundLow}$ ${isBoundLowIncluded ? "inclus" : "exclu"} et $${boundHigh}$ ${isBoundHighIncluded ? "inclus" : "exclu"}`,
|
|
76
|
+
};
|
|
77
|
+
})(),
|
|
78
|
+
0.2,
|
|
79
|
+
],
|
|
80
|
+
]);
|
|
81
|
+
};
|
|
82
|
+
/*
|
|
83
|
+
This toTex() function supports discreteSetNodes with variableNodes inside (this won't create unknown command \\lbracem if m is the first element)
|
|
84
|
+
*/
|
|
85
|
+
const discreteSetNodeToTex = (discreteSetNode) => {
|
|
86
|
+
return `\\lbrace ${discreteSetNode.elements
|
|
87
|
+
.map((el) => el.toTex())
|
|
88
|
+
.join(";")} \\rbrace`;
|
|
89
|
+
};
|
|
90
|
+
const getInstruction = (identifiers) => {
|
|
91
|
+
const { strDescriptionE, k } = identifiers;
|
|
92
|
+
return `Soit $E$ ${strDescriptionE}.
|
|
93
|
+
Donner un $${k}$-uplet d'éléments de E.`;
|
|
94
|
+
};
|
|
95
|
+
const getAnswerStuff = (identifiers) => {
|
|
96
|
+
const { nodeIdsSetE, k } = identifiers;
|
|
97
|
+
const nodeSetE = NodeConstructor.fromIdentifiers(nodeIdsSetE);
|
|
98
|
+
const arrTupleWithoutDuplicate = k < nodeSetE.elements.length
|
|
99
|
+
? [...Array(5).keys()].map(() => randomTupleInDiscreteSetPower(nodeSetE, k, true))
|
|
100
|
+
: [];
|
|
101
|
+
const arrTupleWithDuplicate = [...Array(5).keys()].map(() => randomTupleInDiscreteSetPower(nodeSetE, k, false));
|
|
102
|
+
const arrTuple = shuffle([
|
|
103
|
+
...arrTupleWithoutDuplicate,
|
|
104
|
+
...arrTupleWithDuplicate,
|
|
105
|
+
]);
|
|
106
|
+
return { arrTuple };
|
|
107
|
+
};
|
|
108
|
+
const getAnswer = (identifiers) => {
|
|
109
|
+
const { arrTuple } = getAnswerStuff(identifiers);
|
|
110
|
+
return arrTuple[0].toTex();
|
|
111
|
+
};
|
|
112
|
+
const getHint = (identifiers) => {
|
|
113
|
+
const { k } = identifiers;
|
|
114
|
+
return `Pour prendre un $${k}$-uplet au hasard, tu peux effectuer $${k}$ tirages avec remise d'un élement de $E$.
|
|
115
|
+
|
|
116
|
+
Le $${k}$-uplet se notera (élement tirage $1$ ; élement tirage $2$ ; élement tirage $3$ ; ...).`;
|
|
117
|
+
};
|
|
118
|
+
const getCorrection = (identifiers) => {
|
|
119
|
+
const { k } = identifiers;
|
|
120
|
+
const arrTuple = getAnswerStuff(identifiers).arrTuple;
|
|
121
|
+
return `Voici quelques $${k}$-uplets d'éléments de E :
|
|
122
|
+
|
|
123
|
+
${alignTex(arrTuple.map((tuple) => [tuple.toTex()]))}
|
|
124
|
+
|
|
125
|
+
Attention à ne pas confondre la notation d'un ensemble (entre accolades) et la notation d'un k-uplet (entre parenthèses).`;
|
|
126
|
+
};
|
|
127
|
+
const getPropositions = (n, { answer, ...identifiers }) => {
|
|
128
|
+
const { items } = identifiers;
|
|
129
|
+
const propositions = [];
|
|
130
|
+
items.map(({ str, isValid }) => {
|
|
131
|
+
if (isValid) {
|
|
132
|
+
addValidProp(propositions, str, "raw");
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
tryToAddWrongProp(propositions, str, "raw");
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
return shuffleProps(propositions, n);
|
|
139
|
+
};
|
|
140
|
+
const getKeys = (identifiers) => {
|
|
141
|
+
const { nodeIdsSetE } = identifiers;
|
|
142
|
+
const nodeSetE = NodeConstructor.fromIdentifiers(nodeIdsSetE);
|
|
143
|
+
const arrVarNode = nodeSetE.elements.filter((node) => isVariableNode(node));
|
|
144
|
+
return [
|
|
145
|
+
"semicolon",
|
|
146
|
+
"lbrace", //pas gentil
|
|
147
|
+
"rbrace", //pas gentil
|
|
148
|
+
...arrVarNode.map((varNode) => {
|
|
149
|
+
const tex = varNode.toTex();
|
|
150
|
+
return {
|
|
151
|
+
id: "custom",
|
|
152
|
+
label: tex,
|
|
153
|
+
labelType: "tex",
|
|
154
|
+
mathfieldInstructions: {
|
|
155
|
+
method: "write",
|
|
156
|
+
content: tex,
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
}),
|
|
160
|
+
];
|
|
161
|
+
};
|
|
162
|
+
const isAnswerValid = (ans, { answer, ...identifiers }) => {
|
|
163
|
+
const { nodeIdsSetE, k } = identifiers;
|
|
164
|
+
const nodeSetE = NodeConstructor.fromIdentifiers(nodeIdsSetE);
|
|
165
|
+
function matchGroups(regex, input) {
|
|
166
|
+
const match = regex.exec(input);
|
|
167
|
+
return match?.groups || undefined;
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
const tupleAns = (() => {
|
|
171
|
+
const arrKey = [...Array(k).keys()]
|
|
172
|
+
.map((i) => i + 1)
|
|
173
|
+
.map((v) => `str${v}`);
|
|
174
|
+
const strRegex = `^\\\\left\\(${arrKey
|
|
175
|
+
.map((strKey) => `(?<${strKey}>.*(?!;$))`)
|
|
176
|
+
.join(";")}\\\\right\\)$`;
|
|
177
|
+
const regex = new RegExp(strRegex);
|
|
178
|
+
const ansParts = matchGroups(regex, ans);
|
|
179
|
+
if (ansParts === undefined) {
|
|
180
|
+
throw new Error("Parsing error: ans is not a tuple");
|
|
181
|
+
}
|
|
182
|
+
const arrNode = Object.entries(ansParts).map(([_key, str]) => {
|
|
183
|
+
try {
|
|
184
|
+
return parseAlgebraic(str);
|
|
185
|
+
}
|
|
186
|
+
catch (_) {
|
|
187
|
+
return new VariableNode(str);
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
return new Tuple(arrNode);
|
|
191
|
+
})();
|
|
192
|
+
return NodeComparator.isTupleInCartesianProductOfDiscreteSets(tupleAns, [...Array(k).keys()].map(() => nodeSetE));
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
return handleVEAError(err);
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
const getProposeElementInPowEKQuestion = () => {
|
|
199
|
+
const k = randint(3, 6);
|
|
200
|
+
const dict = randomDiscreteSetIdsAndDescription();
|
|
201
|
+
const nodeSetE = NodeConstructor.fromIdentifiers(dict.nodeIdsSetE);
|
|
202
|
+
const items = (() => {
|
|
203
|
+
const _nbValid = 1;
|
|
204
|
+
const items = [
|
|
205
|
+
//valid: in E^k
|
|
206
|
+
(() => {
|
|
207
|
+
const tuple = randomTupleInDiscreteSetPower(nodeSetE, k, k < nodeSetE.elements.length ? coinFlip() : false);
|
|
208
|
+
return {
|
|
209
|
+
str: `$${tuple.toTex()}$`,
|
|
210
|
+
isValid: true,
|
|
211
|
+
};
|
|
212
|
+
})(),
|
|
213
|
+
//invalid: wrong notation
|
|
214
|
+
(() => {
|
|
215
|
+
const tuple = randomTupleInDiscreteSetPower(nodeSetE, k, k < nodeSetE.elements.length ? coinFlip() : false);
|
|
216
|
+
return {
|
|
217
|
+
str: `$${discreteSetNodeToTex(new DiscreteSetNode(tuple.components))}$`,
|
|
218
|
+
isValid: false,
|
|
219
|
+
};
|
|
220
|
+
})(),
|
|
221
|
+
//invalid: in E^(k-1) and coinFlip(wrongNotation)
|
|
222
|
+
(() => {
|
|
223
|
+
const tuple = randomTupleInDiscreteSetPower(nodeSetE, k - 1, false);
|
|
224
|
+
return {
|
|
225
|
+
str: coinFlip()
|
|
226
|
+
? `$${tuple.toTex()}$`
|
|
227
|
+
: `$${discreteSetNodeToTex(new DiscreteSetNode(tuple.components))}$`,
|
|
228
|
+
isValid: false,
|
|
229
|
+
};
|
|
230
|
+
})(),
|
|
231
|
+
//invalid: "it's not possible"
|
|
232
|
+
(() => {
|
|
233
|
+
return {
|
|
234
|
+
str: "Ce n'est pas possible.",
|
|
235
|
+
isValid: false,
|
|
236
|
+
};
|
|
237
|
+
})(),
|
|
238
|
+
];
|
|
239
|
+
return items;
|
|
240
|
+
})();
|
|
241
|
+
const identifiers = {
|
|
242
|
+
strDescriptionE: dict.strDescriptionE,
|
|
243
|
+
nodeIdsSetE: nodeSetE.toIdentifiers(),
|
|
244
|
+
k,
|
|
245
|
+
items,
|
|
246
|
+
};
|
|
247
|
+
return getQuestionFromIdentifiers(identifiers);
|
|
248
|
+
};
|
|
249
|
+
const getQuestionFromIdentifiers = (identifiers) => {
|
|
250
|
+
const question = {
|
|
251
|
+
instruction: getInstruction(identifiers),
|
|
252
|
+
answer: getAnswer(identifiers),
|
|
253
|
+
keys: getKeys(identifiers),
|
|
254
|
+
answerFormat: "tex",
|
|
255
|
+
identifiers,
|
|
256
|
+
hint: getHint(identifiers),
|
|
257
|
+
correction: getCorrection(identifiers),
|
|
258
|
+
};
|
|
259
|
+
return question;
|
|
260
|
+
};
|
|
261
|
+
export const proposeElementInPowEK = {
|
|
262
|
+
id: "proposeElementInPowEK",
|
|
263
|
+
connector: "=",
|
|
264
|
+
isSingleStep: true,
|
|
265
|
+
label: "Un ensemble $E$ étant donné, donner un $k$-uplet de $E$",
|
|
266
|
+
generator: (nb) => getDistinctQuestions(getProposeElementInPowEKQuestion, nb),
|
|
267
|
+
qcmTimer: 60,
|
|
268
|
+
freeTimer: 60,
|
|
269
|
+
getPropositions,
|
|
270
|
+
isAnswerValid,
|
|
271
|
+
subject: "Mathématiques",
|
|
272
|
+
hasHintAndCorrection: true,
|
|
273
|
+
getQuestionFromIdentifiers,
|
|
274
|
+
};
|
|
@@ -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 findNumberOfCombinationsFromSituation: Exercise<Identifiers>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=findNumberOfCombinationsFromSituation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findNumberOfCombinationsFromSituation.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/sets/combinations/findNumberOfCombinationsFromSituation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAeT,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAEL,eAAe,EAChB,MAAM,qCAAqC,CAAC;AAyG7C,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;AAqDF,KAAK,WAAW,GAAG;IACjB,SAAS,EAAE,SAAS,CAAC;CACtB,CAAC;AA2IF,eAAO,MAAM,qCAAqC,EAAE,QAAQ,CAAC,WAAW,CAcvE,CAAC"}
|