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
|
@@ -0,0 +1,232 @@
|
|
|
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 } from "../../../../tree/nodes/operators/fractionNode.js";
|
|
7
|
+
import { facto } from "../../../../tree/nodes/functions/factorialNode.js";
|
|
8
|
+
import { substract } from "../../../../tree/nodes/operators/substractNode.js";
|
|
9
|
+
import { round } from "../../../../math/utils/round.js";
|
|
10
|
+
import { binom } from "../../../../tree/nodes/operators/binomialCoefficientNode.js";
|
|
11
|
+
import { power, square } from "../../../../tree/nodes/operators/powerNode.js";
|
|
12
|
+
import { handleVEAError } from "../../../../utils/errors/handleVEAError.js";
|
|
13
|
+
import { parseAlgebraic } from "../../../../tree/parsers/latexParser.js";
|
|
14
|
+
import { NodeComparator } from "../../../../tree/utilities/nodeComparator.js";
|
|
15
|
+
const situationTemplates = [
|
|
16
|
+
{
|
|
17
|
+
strInstruction: `Combien y a-t-il de manières différentes d'organiser une file d'attente de $\${total}$ personnes ?`,
|
|
18
|
+
strHint: `le nombre de manières en commençant par le nombre de choix possibles pour la première personne, puis pour la seconde, etc.`,
|
|
19
|
+
strCorrection: `Pour la première personne de la file, il y a $\${total}$ choix possibles.
|
|
20
|
+
Pour la deuxième personne, il y a $\${total-1}$ choix possibles.
|
|
21
|
+
Pour la troisième personne, il y a $\${total-2}$ choix possibles, etc.
|
|
22
|
+
Pour la dernière personne, toutes les autres étant déjà dans la file, il n'y a qu'un choix possible.
|
|
23
|
+
Le nombre de manières différentes d'organiser une file d'attente de $\${total}$ personnes est donc :
|
|
24
|
+
|
|
25
|
+
$$
|
|
26
|
+
\${cardinal}
|
|
27
|
+
$$
|
|
28
|
+
|
|
29
|
+
`,
|
|
30
|
+
dictFuncs: {
|
|
31
|
+
total: () => {
|
|
32
|
+
return {
|
|
33
|
+
value: randint(50, 101),
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
strInstruction: `On fait une pile avec un paquet d'un jeu de $\${total}$ cartes classique que l'on a mélangé. Combien y a-t-il d'organisations possibles de la pile ?`,
|
|
40
|
+
strHint: `le nombre de manières en commençant par le nombre de choix possibles pour la première carte, puis pour la seconde, etc.`,
|
|
41
|
+
strCorrection: `Pour la première carte de la pile, il y a $\${total}$ choix possibles.
|
|
42
|
+
Pour la deuxième carte, il y a $\${total-1}$ choix possibles.
|
|
43
|
+
Pour la troisième carte, il y a $\${total-2}$ choix possibles, etc.
|
|
44
|
+
Pour la dernière carte, toutes les autres étant déjà dans la pile, il n'y a qu'un choix possible.
|
|
45
|
+
Le nombre de manières différentes d'organiser une pile avec un paquet d'un jeu de $\${total}$ classique est donc :
|
|
46
|
+
|
|
47
|
+
$$
|
|
48
|
+
\${cardinal}
|
|
49
|
+
$$
|
|
50
|
+
|
|
51
|
+
`,
|
|
52
|
+
dictFuncs: {
|
|
53
|
+
total: () => {
|
|
54
|
+
return {
|
|
55
|
+
value: random([32, 52]),
|
|
56
|
+
};
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
strInstruction: `À la parade d'une fête de village, $\${total}$ chars défilent les uns après les autres. Combien y a-t-il de défilés possibles de la parade ?`,
|
|
62
|
+
strHint: `le nombre de manières en commençant par le nombre de choix possibles pour le premier char, puis pour le second, etc.`,
|
|
63
|
+
strCorrection: `Pour le premier char de la parade, il y a $\${total}$ choix possibles.
|
|
64
|
+
Pour le deuxième char, il y a $\${total-1}$ choix possibles.
|
|
65
|
+
Pour le troisième char, il y a $\${total-2}$ choix possibles, etc.
|
|
66
|
+
Pour le dernière char, toutes les autres étant déjà passés, il n'y a qu'un choix possible.
|
|
67
|
+
Le nombre de manières différentes d'organiser un défilé avec $\${total}$ chars est donc :
|
|
68
|
+
|
|
69
|
+
$$
|
|
70
|
+
\${cardinal}
|
|
71
|
+
$$
|
|
72
|
+
|
|
73
|
+
`,
|
|
74
|
+
dictFuncs: {
|
|
75
|
+
total: () => {
|
|
76
|
+
return {
|
|
77
|
+
value: random([7, 13]),
|
|
78
|
+
};
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
class SituationConstructor {
|
|
84
|
+
static randomSituationFromTemplate(situationTemplate) {
|
|
85
|
+
const dictSets = Object.entries(situationTemplate.dictFuncs).reduce((acc, [key, func]) => {
|
|
86
|
+
acc[key] = func();
|
|
87
|
+
return acc;
|
|
88
|
+
}, {});
|
|
89
|
+
const { strInstruction, strCorrection: strCorrectionIncomplete } = Object.entries(dictSets).reduce((acc, [key, miniDict]) => {
|
|
90
|
+
acc.strInstruction = acc.strInstruction.replace(`\${${key}}`, `${miniDict.value}`);
|
|
91
|
+
acc.strCorrection = acc.strCorrection.replace(`\${${key}}`, `${miniDict.value}`);
|
|
92
|
+
return acc;
|
|
93
|
+
}, {
|
|
94
|
+
strInstruction: situationTemplate.strInstruction,
|
|
95
|
+
strCorrection: situationTemplate.strCorrection,
|
|
96
|
+
});
|
|
97
|
+
const { total: { value: valueTotal }, } = dictSets;
|
|
98
|
+
const nodeCardinal = facto(valueTotal);
|
|
99
|
+
const strCorrection = strCorrectionIncomplete
|
|
100
|
+
.replace(`\${cardinal}`, `${valueTotal} \\times ${round(valueTotal - 1, 0)} \\times ${round(valueTotal - 2, 0)} \\times ... \\times 1 = ${nodeCardinal.toTex()}`)
|
|
101
|
+
.replace(`\${total}`, `${valueTotal}`)
|
|
102
|
+
.replace(`\${total-1}`, `${round(valueTotal - 1, 0)}`)
|
|
103
|
+
.replace(`\${total-2}`, `${round(valueTotal - 2, 0)}`)
|
|
104
|
+
.replace(`\${total-(picked-1)}`, `1`);
|
|
105
|
+
return {
|
|
106
|
+
nodeIdsCardinal: nodeCardinal.toIdentifiers(),
|
|
107
|
+
strInstruction,
|
|
108
|
+
strHint: situationTemplate.strHint,
|
|
109
|
+
strCorrection,
|
|
110
|
+
dictSets,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const getInstruction = (identifiers) => {
|
|
115
|
+
const { situation: { strInstruction }, } = identifiers;
|
|
116
|
+
return strInstruction;
|
|
117
|
+
};
|
|
118
|
+
const getAnswerNode = (identifiers) => {
|
|
119
|
+
const { situation: { nodeIdsCardinal }, } = identifiers;
|
|
120
|
+
const nodeCardinal = NodeConstructor.fromIdentifiers(nodeIdsCardinal);
|
|
121
|
+
return nodeCardinal;
|
|
122
|
+
};
|
|
123
|
+
const getAnswer = (identifiers) => {
|
|
124
|
+
return getAnswerNode(identifiers).toTex();
|
|
125
|
+
};
|
|
126
|
+
const getHint = (identifiers) => {
|
|
127
|
+
const { situation: { dictSets, strHint }, } = identifiers;
|
|
128
|
+
const { total: { value: valueTotal }, } = dictSets;
|
|
129
|
+
return `Ici, il faut tenir compte de l'ordre.
|
|
130
|
+
Tu as trois possibilités :
|
|
131
|
+
- soit tu appliques directement la formule du nombre de permutations d'un ensemble à $${valueTotal}$ éléments
|
|
132
|
+
- soit tu appliques la formule du nombre d'arrangements de $${valueTotal}$ éléments pris parmi $${valueTotal}$ éléments
|
|
133
|
+
- soit tu comptes ${strHint}`;
|
|
134
|
+
};
|
|
135
|
+
const getCorrection = (identifiers) => {
|
|
136
|
+
const { situation: { strCorrection, dictSets }, } = identifiers;
|
|
137
|
+
const { total: { value: valueTotal }, } = dictSets;
|
|
138
|
+
return `${strCorrection}
|
|
139
|
+
|
|
140
|
+
On pouvait aussi utiliser la formule du nombre d'arrangements :
|
|
141
|
+
On arrange $${valueTotal}$ éléments pris parmi $${valueTotal}$ éléments.
|
|
142
|
+
En effet :
|
|
143
|
+
|
|
144
|
+
$$
|
|
145
|
+
${frac(facto(valueTotal), facto(substract(valueTotal, valueTotal))).toTex()} = ${frac(facto(valueTotal), facto(0)).toTex()} = ${frac(facto(valueTotal), 1).toTex()} = ${facto(valueTotal).toTex()}
|
|
146
|
+
$$
|
|
147
|
+
|
|
148
|
+
`;
|
|
149
|
+
};
|
|
150
|
+
const getPropositions = (n, { answer, ...identifiers }) => {
|
|
151
|
+
const { situation: { dictSets }, } = identifiers;
|
|
152
|
+
const propositions = [];
|
|
153
|
+
addValidProp(propositions, answer);
|
|
154
|
+
const { total: { value: valueTotal }, } = dictSets;
|
|
155
|
+
const valuePicked = valueTotal;
|
|
156
|
+
//student: binom(total, picked)
|
|
157
|
+
{
|
|
158
|
+
const nodeWrong = binom(valueTotal, valuePicked);
|
|
159
|
+
tryToAddWrongProp(propositions, nodeWrong.toTex());
|
|
160
|
+
}
|
|
161
|
+
//student: power(total, picked)
|
|
162
|
+
{
|
|
163
|
+
const nodeWrong = power(valueTotal, valuePicked);
|
|
164
|
+
tryToAddWrongProp(propositions, nodeWrong.toTex());
|
|
165
|
+
}
|
|
166
|
+
//student: square(total)
|
|
167
|
+
{
|
|
168
|
+
const nodeWrong = square(valueTotal);
|
|
169
|
+
tryToAddWrongProp(propositions, nodeWrong.toTex());
|
|
170
|
+
}
|
|
171
|
+
return shuffleProps(propositions, n);
|
|
172
|
+
};
|
|
173
|
+
const getKeys = () => {
|
|
174
|
+
const keyFacto = {
|
|
175
|
+
id: "custom",
|
|
176
|
+
label: "!",
|
|
177
|
+
labelType: "tex",
|
|
178
|
+
mathfieldInstructions: {
|
|
179
|
+
method: "write",
|
|
180
|
+
content: "!",
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
return [
|
|
184
|
+
// "facto",
|
|
185
|
+
keyFacto,
|
|
186
|
+
];
|
|
187
|
+
};
|
|
188
|
+
const isAnswerValid = (ans, { answer }) => {
|
|
189
|
+
try {
|
|
190
|
+
const nodeAns = parseAlgebraic(ans);
|
|
191
|
+
const nodeAnswer = parseAlgebraic(answer);
|
|
192
|
+
return NodeComparator.isEqualViaFrac(nodeAns, nodeAnswer);
|
|
193
|
+
}
|
|
194
|
+
catch (e) {
|
|
195
|
+
handleVEAError(e);
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
const getFindNumberOfPartialPermutationsFromSituationQuestion = () => {
|
|
200
|
+
const situationTemplate = random(situationTemplates);
|
|
201
|
+
const situation = SituationConstructor.randomSituationFromTemplate(situationTemplate);
|
|
202
|
+
const identifiers = {
|
|
203
|
+
situation,
|
|
204
|
+
};
|
|
205
|
+
return getQuestionFromIdentifiers(identifiers);
|
|
206
|
+
};
|
|
207
|
+
const getQuestionFromIdentifiers = (identifiers) => {
|
|
208
|
+
const question = {
|
|
209
|
+
instruction: getInstruction(identifiers),
|
|
210
|
+
answer: getAnswer(identifiers),
|
|
211
|
+
keys: getKeys(identifiers),
|
|
212
|
+
answerFormat: "tex",
|
|
213
|
+
identifiers,
|
|
214
|
+
hint: getHint(identifiers),
|
|
215
|
+
correction: getCorrection(identifiers),
|
|
216
|
+
};
|
|
217
|
+
return question;
|
|
218
|
+
};
|
|
219
|
+
export const findNumberOfPermutationsFromSituation = {
|
|
220
|
+
id: "findNumberOfPermutationsFromSituation",
|
|
221
|
+
connector: "=",
|
|
222
|
+
isSingleStep: true,
|
|
223
|
+
label: "Déterminer le nombre de permutations d'un ensemble à partir d'une situation",
|
|
224
|
+
generator: (nb) => getDistinctQuestions(getFindNumberOfPartialPermutationsFromSituationQuestion, nb),
|
|
225
|
+
qcmTimer: 60,
|
|
226
|
+
freeTimer: 60,
|
|
227
|
+
getPropositions,
|
|
228
|
+
isAnswerValid,
|
|
229
|
+
subject: "Mathématiques",
|
|
230
|
+
hasHintAndCorrection: true,
|
|
231
|
+
getQuestionFromIdentifiers,
|
|
232
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/sets/partialPermutations/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mDAAmD,CAAC;AAClE,cAAc,4CAA4C,CAAC"}
|
|
@@ -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 proposePartialPermutation: Exercise<Identifiers>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=proposePartialPermutation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposePartialPermutation.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/sets/partialPermutations/proposePartialPermutation.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;AAqSF,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,WAAW,CAe3D,CAAC"}
|
|
@@ -0,0 +1,343 @@
|
|
|
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 distincts 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 arrTuple = shuffle([...arrTupleWithoutDuplicate]);
|
|
102
|
+
return { arrTuple };
|
|
103
|
+
};
|
|
104
|
+
const getAnswer = (identifiers) => {
|
|
105
|
+
const { arrTuple } = getAnswerStuff(identifiers);
|
|
106
|
+
if (arrTuple.length === 0) {
|
|
107
|
+
return "\\text{Ce n'est pas possible.}";
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
return arrTuple[0].toTex();
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
const getHint = (identifiers) => {
|
|
114
|
+
const { k } = identifiers;
|
|
115
|
+
return `Pour prendre un $${k}$-uplet d'éléments distincts de $E$, il faut effectuer $${k}$ tirages d'un élement de $E$, successifs et sans remise.
|
|
116
|
+
Il faut donc s'assurer que l'ensemble $E$ contient suffisament d'éléments pour former un $${k}$-uplet d'éléments distincts.
|
|
117
|
+
|
|
118
|
+
Le $${k}$-uplet se notera (élement tirage $1$ ; élement tirage $2$ ; élement tirage $3$ ; ...).`;
|
|
119
|
+
};
|
|
120
|
+
const getCorrection = (identifiers) => {
|
|
121
|
+
const { nodeIdsSetE, k } = identifiers;
|
|
122
|
+
const nodeSetE = NodeConstructor.fromIdentifiers(nodeIdsSetE);
|
|
123
|
+
const arrTuple = getAnswerStuff(identifiers).arrTuple;
|
|
124
|
+
return `
|
|
125
|
+
$$
|
|
126
|
+
E = ${discreteSetNodeToTex(nodeSetE)}
|
|
127
|
+
$$
|
|
128
|
+
|
|
129
|
+
${(() => {
|
|
130
|
+
if (arrTuple.length === 0) {
|
|
131
|
+
return `On veut prendre $${k}$ éléments distincts dans un ensemble qui n'en contient que $${nodeSetE.elements.length}$.
|
|
132
|
+
Ce n'est pas possible.`;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
return `Voici quelques $${k}$-uplets d'éléments distincts de E :
|
|
136
|
+
|
|
137
|
+
${alignTex(arrTuple.map((tuple) => [tuple.toTex()]))}
|
|
138
|
+
|
|
139
|
+
Attention à ne pas confondre la notation d'un ensemble (entre accolades) et la notation d'un k-uplet (entre parenthèses).`;
|
|
140
|
+
}
|
|
141
|
+
})()}`;
|
|
142
|
+
};
|
|
143
|
+
const getPropositions = (n, { answer, ...identifiers }) => {
|
|
144
|
+
const { items } = identifiers;
|
|
145
|
+
const propositions = [];
|
|
146
|
+
items.map(({ str, isValid }) => {
|
|
147
|
+
if (isValid) {
|
|
148
|
+
addValidProp(propositions, str, "raw");
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
tryToAddWrongProp(propositions, str, "raw");
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
return shuffleProps(propositions, n);
|
|
155
|
+
};
|
|
156
|
+
const getKeys = (identifiers) => {
|
|
157
|
+
const { nodeIdsSetE } = identifiers;
|
|
158
|
+
const nodeSetE = NodeConstructor.fromIdentifiers(nodeIdsSetE);
|
|
159
|
+
const arrVarNode = nodeSetE.elements.filter((node) => isVariableNode(node));
|
|
160
|
+
return [
|
|
161
|
+
"semicolon",
|
|
162
|
+
"lbrace", //pas gentil
|
|
163
|
+
"rbrace", //pas gentil
|
|
164
|
+
...arrVarNode.map((varNode) => {
|
|
165
|
+
const tex = varNode.toTex();
|
|
166
|
+
return {
|
|
167
|
+
id: "custom",
|
|
168
|
+
label: tex,
|
|
169
|
+
labelType: "tex",
|
|
170
|
+
mathfieldInstructions: {
|
|
171
|
+
method: "write",
|
|
172
|
+
content: tex,
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
}),
|
|
176
|
+
{
|
|
177
|
+
id: "custom",
|
|
178
|
+
label: "\\text{Ce n'est pas possible.}",
|
|
179
|
+
labelType: "tex",
|
|
180
|
+
mathfieldInstructions: {
|
|
181
|
+
method: "write",
|
|
182
|
+
content: "\\text{Ce n'est pas possible.}",
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
];
|
|
186
|
+
};
|
|
187
|
+
const isAnswerValid = (ans, { answer, ...identifiers }) => {
|
|
188
|
+
if (ans === answer) {
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
const { nodeIdsSetE, k } = identifiers;
|
|
192
|
+
const nodeSetE = NodeConstructor.fromIdentifiers(nodeIdsSetE);
|
|
193
|
+
function matchGroups(regex, input) {
|
|
194
|
+
const match = regex.exec(input);
|
|
195
|
+
return match?.groups || undefined;
|
|
196
|
+
}
|
|
197
|
+
try {
|
|
198
|
+
const tupleAns = (() => {
|
|
199
|
+
const arrKey = [...Array(k).keys()]
|
|
200
|
+
.map((i) => i + 1)
|
|
201
|
+
.map((v) => `str${v}`);
|
|
202
|
+
const strRegex = `^\\\\left\\(${arrKey
|
|
203
|
+
.map((strKey) => `(?<${strKey}>.*(?!;$))`)
|
|
204
|
+
.join(";")}\\\\right\\)$`;
|
|
205
|
+
const regex = new RegExp(strRegex);
|
|
206
|
+
const ansParts = matchGroups(regex, ans);
|
|
207
|
+
if (ansParts === undefined) {
|
|
208
|
+
throw new Error("Parsing error: ans is not a tuple");
|
|
209
|
+
}
|
|
210
|
+
const arrNode = Object.entries(ansParts).map(([_key, str]) => {
|
|
211
|
+
try {
|
|
212
|
+
return parseAlgebraic(str);
|
|
213
|
+
}
|
|
214
|
+
catch (_) {
|
|
215
|
+
return new VariableNode(str);
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
return new Tuple(arrNode);
|
|
219
|
+
})();
|
|
220
|
+
return NodeComparator.isTupleInCartesianProductOfDiscreteSets(tupleAns, [...Array(k).keys()].map(() => nodeSetE));
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
return handleVEAError(err);
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
const getProposePartialPermutationQuestion = () => {
|
|
227
|
+
const k = randint(3, 6);
|
|
228
|
+
const dict = randomDiscreteSetIdsAndDescription();
|
|
229
|
+
const nodeSetE = NodeConstructor.fromIdentifiers(dict.nodeIdsSetE);
|
|
230
|
+
const items = (() => {
|
|
231
|
+
const _nbValid = 1;
|
|
232
|
+
const items = [
|
|
233
|
+
//valid: tuple or "it's not possible"
|
|
234
|
+
(() => {
|
|
235
|
+
if (k <= nodeSetE.elements.length) {
|
|
236
|
+
const tuple = randomTupleInDiscreteSetPower(nodeSetE, k, true);
|
|
237
|
+
return {
|
|
238
|
+
str: `$${tuple.toTex()}$`,
|
|
239
|
+
isValid: true,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
return {
|
|
244
|
+
str: "Ce n'est pas possible.",
|
|
245
|
+
isValid: true,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
})(),
|
|
249
|
+
//invalid: contains duplicate
|
|
250
|
+
(() => {
|
|
251
|
+
const tuple = randomTupleInDiscreteSetPower(nodeSetE, k, false, true);
|
|
252
|
+
return {
|
|
253
|
+
str: `$${discreteSetNodeToTex(new DiscreteSetNode(tuple.components))}$`,
|
|
254
|
+
isValid: false,
|
|
255
|
+
};
|
|
256
|
+
})(),
|
|
257
|
+
//invalid: wrong notation
|
|
258
|
+
...(() => {
|
|
259
|
+
if (k <= nodeSetE.elements.length) {
|
|
260
|
+
const tuple = randomTupleInDiscreteSetPower(nodeSetE, k, true);
|
|
261
|
+
return [
|
|
262
|
+
{
|
|
263
|
+
str: `$${discreteSetNodeToTex(new DiscreteSetNode(tuple.components))}$`,
|
|
264
|
+
isValid: false,
|
|
265
|
+
},
|
|
266
|
+
];
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
return [];
|
|
270
|
+
}
|
|
271
|
+
})(),
|
|
272
|
+
//invalid: in E^card(E)
|
|
273
|
+
...(() => {
|
|
274
|
+
if (k <= nodeSetE.elements.length) {
|
|
275
|
+
return [];
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
const tuple = randomTupleInDiscreteSetPower(nodeSetE, nodeSetE.elements.length, true);
|
|
279
|
+
return [
|
|
280
|
+
{
|
|
281
|
+
str: `$${tuple.toTex()}$`,
|
|
282
|
+
isValid: false,
|
|
283
|
+
},
|
|
284
|
+
];
|
|
285
|
+
}
|
|
286
|
+
})(),
|
|
287
|
+
//invalid: "it's not possible" or contains duplicate
|
|
288
|
+
...(() => {
|
|
289
|
+
if (k <= nodeSetE.elements.length) {
|
|
290
|
+
const tuple = randomTupleInDiscreteSetPower(nodeSetE, k, false, true);
|
|
291
|
+
return [
|
|
292
|
+
{
|
|
293
|
+
str: `$${discreteSetNodeToTex(new DiscreteSetNode(tuple.components))}$`,
|
|
294
|
+
isValid: false,
|
|
295
|
+
},
|
|
296
|
+
];
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
return [
|
|
300
|
+
{
|
|
301
|
+
str: "Ce n'est pas possible.",
|
|
302
|
+
isValid: false,
|
|
303
|
+
},
|
|
304
|
+
];
|
|
305
|
+
}
|
|
306
|
+
})(),
|
|
307
|
+
];
|
|
308
|
+
return items;
|
|
309
|
+
})();
|
|
310
|
+
const identifiers = {
|
|
311
|
+
strDescriptionE: dict.strDescriptionE,
|
|
312
|
+
nodeIdsSetE: nodeSetE.toIdentifiers(),
|
|
313
|
+
k,
|
|
314
|
+
items,
|
|
315
|
+
};
|
|
316
|
+
return getQuestionFromIdentifiers(identifiers);
|
|
317
|
+
};
|
|
318
|
+
const getQuestionFromIdentifiers = (identifiers) => {
|
|
319
|
+
const question = {
|
|
320
|
+
instruction: getInstruction(identifiers),
|
|
321
|
+
answer: getAnswer(identifiers),
|
|
322
|
+
keys: getKeys(identifiers),
|
|
323
|
+
answerFormat: "tex",
|
|
324
|
+
identifiers,
|
|
325
|
+
hint: getHint(identifiers),
|
|
326
|
+
correction: getCorrection(identifiers),
|
|
327
|
+
};
|
|
328
|
+
return question;
|
|
329
|
+
};
|
|
330
|
+
export const proposePartialPermutation = {
|
|
331
|
+
id: "proposePartialPermutation",
|
|
332
|
+
connector: "=",
|
|
333
|
+
isSingleStep: true,
|
|
334
|
+
label: "Un ensemble $E$ étant donné, donner un $k$-uplet d'éléments distincts de $E$",
|
|
335
|
+
generator: (nb) => getDistinctQuestions(getProposePartialPermutationQuestion, nb),
|
|
336
|
+
qcmTimer: 60,
|
|
337
|
+
freeTimer: 60,
|
|
338
|
+
getPropositions,
|
|
339
|
+
isAnswerValid,
|
|
340
|
+
subject: "Mathématiques",
|
|
341
|
+
hasHintAndCorrection: true,
|
|
342
|
+
getQuestionFromIdentifiers,
|
|
343
|
+
};
|
package/lib/exercises/math/spaceGeometry/vectors/spaceVectorLinearCombinationCoords.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spaceVectorLinearCombinationCoords.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/spaceGeometry/vectors/spaceVectorLinearCombinationCoords.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAaT,MAAM,6BAA6B,CAAC;AAQrC,KAAK,WAAW,GAAG;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;
|
|
1
|
+
{"version":3,"file":"spaceVectorLinearCombinationCoords.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/spaceGeometry/vectors/spaceVectorLinearCombinationCoords.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAaT,MAAM,6BAA6B,CAAC;AAQrC,KAAK,WAAW,GAAG;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAkFF,eAAO,MAAM,kCAAkC,EAAE,QAAQ,CAAC,WAAW,CAcpE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Exercise } from "../../../../exercises/exercise.js";
|
|
2
|
+
import { NodeIdentifiers } from "../../../../tree/nodes/nodeConstructor.js";
|
|
3
|
+
type Identifiers = {
|
|
4
|
+
nodeIdsF: NodeIdentifiers;
|
|
5
|
+
};
|
|
6
|
+
export declare const parityOfCosAXTimesSinBX: Exercise<Identifiers>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=parityOfCosAXTimesSinBX.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parityOfCosAXTimesSinBX.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/trigonometry/functions/parityOfCosAXTimesSinBX.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAaT,MAAM,6BAA6B,CAAC;AAMrC,OAAO,EAEL,eAAe,EAChB,MAAM,qCAAqC,CAAC;AAqD7C,KAAK,WAAW,GAAG;IACjB,QAAQ,EAAE,eAAe,CAAC;CAC3B,CAAC;AAoKF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,WAAW,CAczD,CAAC"}
|