math-exercises 3.0.103 → 3.0.105
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/math/probaStat/basicProbas/ballsBasicProbas.d.ts.map +1 -1
- package/lib/exercises/math/probaStat/basicProbas/ballsBasicProbas.js +2 -2
- package/lib/exercises/math/probaStat/probaFromTableNoContext.js +1 -1
- package/lib/exercises/math/probaStat/stats1var/getQuartileProportionQuestion.d.ts +1 -1
- package/lib/exercises/math/probaStat/stats1var/getQuartileProportionQuestion.d.ts.map +1 -1
- package/lib/exercises/math/probaStat/stats1var/getQuartileProportionQuestion.js +115 -94
- package/lib/index.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ballsBasicProbas.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/probaStat/basicProbas/ballsBasicProbas.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,QAAQ,EAaT,MAAM,6BAA6B,CAAC;AAUrC,KAAK,WAAW,GAAG;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;
|
|
1
|
+
{"version":3,"file":"ballsBasicProbas.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/probaStat/basicProbas/ballsBasicProbas.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,QAAQ,EAaT,MAAM,6BAA6B,CAAC;AAUrC,KAAK,WAAW,GAAG;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAwGF,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,WAAW,CAclD,CAAC"}
|
|
@@ -11,7 +11,7 @@ pluralize;
|
|
|
11
11
|
const getInstruction = (identifiers) => {
|
|
12
12
|
const { repartitions, colorAskedIndex } = identifiers;
|
|
13
13
|
const colorAsked = colors[colorAskedIndex];
|
|
14
|
-
const counts = repartitions.map((count, index) => `$${count}$ ${pluralize("boule", count)} ${colors[index]}`);
|
|
14
|
+
const counts = repartitions.map((count, index) => `$${count}$ ${pluralize("boule", count)} ${pluralize(colors[index], count)}`);
|
|
15
15
|
return `Dans un sac, il y a ${counts[0]}, ${counts[1]} et ${counts[2]}.
|
|
16
16
|
|
|
17
17
|
Quelle est la probabilité de tirer une boule ${colorAsked} ?`;
|
|
@@ -31,7 +31,7 @@ const getCorrection = (identifiers) => {
|
|
|
31
31
|
const { repartitions, colorAskedIndex } = identifiers;
|
|
32
32
|
const nbColorAsked = repartitions[colorAskedIndex];
|
|
33
33
|
const total = repartitions.reduce((acc, curr) => (acc += curr), 0);
|
|
34
|
-
return `Puisque toutes les boules ont la même chance d'être tirée, la probabilité d'obtenir une boule ${colors[colorAskedIndex]} est le nombre de boules ${colors[colorAskedIndex]} divisé par le nombre total de boules, c'est à dire :
|
|
34
|
+
return `Puisque toutes les boules ont la même chance d'être tirée, la probabilité d'obtenir une boule ${colors[colorAskedIndex]} est le nombre de boules ${pluralize(colors[colorAskedIndex], repartitions[colorAskedIndex])} divisé par le nombre total de boules, c'est à dire :
|
|
35
35
|
|
|
36
36
|
$$
|
|
37
37
|
${frac(nbColorAsked, total).toSimplificationTex()}
|
|
@@ -259,7 +259,7 @@ export const probaFromTableNoContext = {
|
|
|
259
259
|
connector: "=",
|
|
260
260
|
label: "Utiliser un tableau à double entrée pour calculer une probabilité (sans contexte)",
|
|
261
261
|
isSingleStep: true,
|
|
262
|
-
generator: (nb) => getDistinctQuestions(getProbaFromTableNoContextQuestion, nb),
|
|
262
|
+
generator: (nb, opts) => getDistinctQuestions(() => getProbaFromTableNoContextQuestion(opts), nb),
|
|
263
263
|
qcmTimer: 60,
|
|
264
264
|
freeTimer: 60,
|
|
265
265
|
getPropositions,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getQuartileProportionQuestion.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/probaStat/stats1var/getQuartileProportionQuestion.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAeT,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"getQuartileProportionQuestion.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/probaStat/stats1var/getQuartileProportionQuestion.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAeT,MAAM,6BAA6B,CAAC;AASrC,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,MAAM,CAAC;IACV,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAoOF,eAAO,MAAM,6BAA6B,EAAE,QAAQ,CAAC,WAAW,CAqB/D,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { addValidProp, shuffleProps, tryToAddWrongProp, } from "../../../../exercises/exercise.js";
|
|
2
2
|
import { getDistinctQuestions } from "../../../../exercises/utils/getDistinctQuestions.js";
|
|
3
3
|
import { randint } from "../../../../math/utils/random/randint.js";
|
|
4
|
+
import { randTupleInt } from "../../../../math/utils/random/randTupleInt.js";
|
|
4
5
|
import { coinFlip } from "../../../../utils/alea/coinFlip.js";
|
|
5
6
|
import { handleVEAError } from "../../../../utils/errors/handleVEAError.js";
|
|
6
7
|
import { dollarize } from "../../../../utils/latex/dollarize.js";
|
|
@@ -13,30 +14,16 @@ const getPropositions = (n, { answer }) => {
|
|
|
13
14
|
return shuffleProps(propositions, n);
|
|
14
15
|
};
|
|
15
16
|
const getAnswer = ({ serie1, serie2, a, b, isBetween, }) => {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
if ((val >= a || otherSeries[idx + 1] > a) &&
|
|
26
|
-
(val <= b || otherSeries[idx - 1] < b)) {
|
|
27
|
-
count++;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
if (val < b) {
|
|
32
|
-
count++;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
17
|
+
if (isBetween) {
|
|
18
|
+
const serie1Space = serie1.indexOf(b) - serie1.indexOf(a);
|
|
19
|
+
const serie2Space = serie2.indexOf(b) - serie2.indexOf(a);
|
|
20
|
+
return serie1Space > serie2Space ? "Série $1$" : "Série $2$";
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
const serie1Index = serie1.indexOf(b);
|
|
24
|
+
const serie2Index = serie2.indexOf(b);
|
|
25
|
+
return serie1Index < serie2Index ? "Série $1$" : "Série $2$";
|
|
35
26
|
}
|
|
36
|
-
const mainSeriesText = mainSeries === serie1 ? "Série $1$" : "Série $2$";
|
|
37
|
-
const otherSeriesText = mainSeries === serie1 ? "Série $2$" : "Série $1$";
|
|
38
|
-
const condition = isBetween ? diff >= count : indexOfB < count;
|
|
39
|
-
return condition ? mainSeriesText : otherSeriesText;
|
|
40
27
|
};
|
|
41
28
|
const getInstruction = ({ labels, serie1, serie2, a, b, isBetween, }) => {
|
|
42
29
|
const question = isBetween
|
|
@@ -60,63 +47,29 @@ Les quartiles permettent de découper une série en quatre parties égales :
|
|
|
60
47
|
};
|
|
61
48
|
const getCorrection = (identifiers) => {
|
|
62
49
|
const { labels, serie1, serie2, a, b, isBetween } = identifiers;
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
i++;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
if (val < b) {
|
|
81
|
-
i++;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
50
|
+
const labelDollarized = labels.map((l, i) => i === 1 || i === 3 ? dollarize(l) : l);
|
|
51
|
+
if (isBetween) {
|
|
52
|
+
const serie1BIndex = serie1.indexOf(b);
|
|
53
|
+
const serie2BIndex = serie2.indexOf(b);
|
|
54
|
+
const serie1AIndex = serie1.indexOf(a);
|
|
55
|
+
const serie2AIndex = serie2.indexOf(a);
|
|
56
|
+
const serie1Space = serie1BIndex - serie1AIndex;
|
|
57
|
+
const serie2Space = serie2BIndex - serie2AIndex;
|
|
58
|
+
return `Dans la série $1$, ${labelDollarized[serie1AIndex]} $=${a}$, et ${labelDollarized[serie1BIndex]} $=${b}$, donc $${serie1Space * 25} \\%$ des valeurs sont comprises entre $${a}$ et $${b}$.
|
|
59
|
+
|
|
60
|
+
Dans la série $2$, ${labelDollarized[serie2AIndex]} $=${a}$, et ${labelDollarized[serie2BIndex]} $=${b}$, donc $${serie2Space * 25} \\%$ des valeurs sont comprises entre $${a}$ et $${b}$.
|
|
61
|
+
|
|
62
|
+
C'est donc la ${serie2Space < serie1Space ? "série $1$" : "série $2$"} qui a la plus grande proportion de valeurs supérieures à $${b}$.`;
|
|
84
63
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
const valueB = b;
|
|
90
|
-
const diff = indexOfB - indexOfA + 1;
|
|
91
|
-
const percentageBetween = quartilePercentages[diff - 1];
|
|
92
|
-
const percentageAbove = 100 - quartilePercentages[indexOfB];
|
|
93
|
-
const answer = getAnswer(identifiers);
|
|
94
|
-
const answerFormatted = answer === "Série $1$" ? "série $1$" : "série $2$";
|
|
95
|
-
const decideWord = answerFormatted === mainSeriesLabel ? "moins" : "plus";
|
|
96
|
-
const proportionB = isBetween
|
|
97
|
-
? `$${percentageBetween}\\%$ des valeurs sont entre $${valueA}$ et $${valueB}$.\n\n`
|
|
98
|
-
: `$${percentageAbove}\\%$ des valeurs sont supérieures à $${valueB}$.\n\n`;
|
|
99
|
-
const proportionOther = i === 0
|
|
100
|
-
? `Il n'y a aucune valeur dans l'intervalle $[${valueA}; ${valueB}]$.\n\n`
|
|
101
|
-
: isBetween
|
|
102
|
-
? `${decideWord} $${percentageBetween}\\%$ des valeurs sont entre $${valueA}$ et $${valueB}$.\n\n`
|
|
103
|
-
: `${otherSeries[indexOfB] > valueB ? "plus" : "moins"} de $${100 - quartilePercentages[i - 1]}\\%$ des valeurs sont supérieures à $${valueB}$.\n\n`;
|
|
104
|
-
const comparison = isBetween
|
|
105
|
-
? `La ${answer} a donc une proportion plus grande de valeurs dans l'intervalle.`
|
|
106
|
-
: `La ${answer} a donc une proportion plus grande de valeurs supérieures à $${valueB}$.`;
|
|
107
|
-
return isBetween
|
|
108
|
-
? `On peut estimer cette proportion en observant la position des valeurs $${valueA}$ et $${valueB}$ dans chaque série :
|
|
64
|
+
else {
|
|
65
|
+
const serie1Index = serie1.indexOf(b);
|
|
66
|
+
const serie2Index = serie2.indexOf(b);
|
|
67
|
+
return `Dans la série $1$, ${labelDollarized[serie1Index]} $=${b}$, donc $${100 - serie1Index * 25} \\%$ des valeurs sont supérieures à $${b}$.
|
|
109
68
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
: `On peut estimer cette proportion en observant la position de la valeur $${valueB}$ dans chaque série :
|
|
115
|
-
|
|
116
|
-
- Dans la ${mainSeriesLabel}, on a $${labelB} = ${valueB}$, donc ${proportionB}
|
|
117
|
-
- Dans la ${otherSeriesLabel}, on a $${labelB} = ${otherSeries[indexOfB]}$, ${proportionOther}
|
|
118
|
-
|
|
119
|
-
${comparison}`;
|
|
69
|
+
Dans la série $2$, ${labelDollarized[serie2Index]} $=${b}$, donc $${100 - serie2Index * 25} \\%$ des valeurs sont supérieures à $${b}$.
|
|
70
|
+
|
|
71
|
+
C'est donc la ${serie1Index < serie2Index ? "série $1$" : "série $2$"} qui a la plus grande proportion de valeurs supérieures à $${b}$.`;
|
|
72
|
+
}
|
|
120
73
|
};
|
|
121
74
|
const getKeys = () => [];
|
|
122
75
|
const isAnswerValid = (ans, { answer }) => {
|
|
@@ -127,25 +80,93 @@ const isAnswerValid = (ans, { answer }) => {
|
|
|
127
80
|
return handleVEAError(err);
|
|
128
81
|
}
|
|
129
82
|
};
|
|
130
|
-
const makeQuartileSeries = (min, exclude) => {
|
|
131
|
-
const serie = [min];
|
|
132
|
-
for (let i = 0; i < 4; i++) {
|
|
133
|
-
const prev = serie[serie.length - 1];
|
|
134
|
-
serie.push(randint(prev + 1, prev + 6, exclude));
|
|
135
|
-
}
|
|
136
|
-
return serie;
|
|
137
|
-
};
|
|
138
83
|
const getGetQuartileProportionQuestionQuestion = () => {
|
|
139
84
|
const labels = ["Min", "Q_1", "Méd", "Q_3", "Max"];
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
85
|
+
let a = undefined;
|
|
86
|
+
let b;
|
|
87
|
+
let serie1;
|
|
88
|
+
let serie2;
|
|
143
89
|
const isBetween = coinFlip();
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
90
|
+
if (isBetween) {
|
|
91
|
+
const serie1Indexes = randTupleInt(2, {
|
|
92
|
+
from: 0,
|
|
93
|
+
to: 5,
|
|
94
|
+
allDifferent: true,
|
|
95
|
+
}).sort((a, b) => a - b);
|
|
96
|
+
let serie2Indexes = [];
|
|
97
|
+
do {
|
|
98
|
+
serie2Indexes = randTupleInt(2, {
|
|
99
|
+
from: 0,
|
|
100
|
+
to: 5,
|
|
101
|
+
allDifferent: true,
|
|
102
|
+
}).sort((a, b) => a - b);
|
|
103
|
+
} while (serie2Indexes[1] - serie2Indexes[0] ===
|
|
104
|
+
serie1Indexes[1] - serie1Indexes[0] ||
|
|
105
|
+
(serie1Indexes[0] === serie2Indexes[0] &&
|
|
106
|
+
serie1Indexes[1] === serie2Indexes[1]));
|
|
107
|
+
a = randint(5, 20);
|
|
108
|
+
b = randint(a + 5, 30);
|
|
109
|
+
const serie1Prev = randTupleInt(serie1Indexes[0], {
|
|
110
|
+
from: 1,
|
|
111
|
+
to: a,
|
|
112
|
+
allDifferent: true,
|
|
113
|
+
}).sort((a, b) => a - b);
|
|
114
|
+
const serie1Between = randTupleInt(serie1Indexes[1] - serie1Indexes[0] - 1, {
|
|
115
|
+
from: a + 1,
|
|
116
|
+
to: b,
|
|
117
|
+
allDifferent: true,
|
|
118
|
+
}).sort((a, b) => a - b);
|
|
119
|
+
const serie1End = randTupleInt(4 - serie1Indexes[1], {
|
|
120
|
+
from: b + 1,
|
|
121
|
+
to: 40,
|
|
122
|
+
allDifferent: true,
|
|
123
|
+
}).sort((a, b) => a - b);
|
|
124
|
+
const serie2Prev = randTupleInt(serie2Indexes[0], {
|
|
125
|
+
from: 1,
|
|
126
|
+
to: a,
|
|
127
|
+
allDifferent: true,
|
|
128
|
+
}).sort((a, b) => a - b);
|
|
129
|
+
const serie2Between = randTupleInt(serie2Indexes[1] - serie2Indexes[0] - 1, {
|
|
130
|
+
from: a + 1,
|
|
131
|
+
to: b,
|
|
132
|
+
allDifferent: true,
|
|
133
|
+
}).sort((a, b) => a - b);
|
|
134
|
+
const serie2End = randTupleInt(4 - serie2Indexes[1], {
|
|
135
|
+
from: b + 1,
|
|
136
|
+
to: 40,
|
|
137
|
+
allDifferent: true,
|
|
138
|
+
}).sort((a, b) => a - b);
|
|
139
|
+
serie1 = [...serie1Prev, a, ...serie1Between, b, ...serie1End];
|
|
140
|
+
serie2 = [...serie2Prev, a, ...serie2Between, b, ...serie2End];
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
b = randint(5, 20);
|
|
144
|
+
//build les deux series avec a ayant un index <4 et différents
|
|
145
|
+
const serie1Index = randint(0, 4);
|
|
146
|
+
const serie2Index = randint(0, 4, [serie1Index]);
|
|
147
|
+
const serie1Prev = randTupleInt(serie1Index, {
|
|
148
|
+
from: 1,
|
|
149
|
+
to: b,
|
|
150
|
+
allDifferent: true,
|
|
151
|
+
}).sort((a, b) => a - b);
|
|
152
|
+
const serie2Prev = randTupleInt(serie2Index, {
|
|
153
|
+
from: 1,
|
|
154
|
+
to: b,
|
|
155
|
+
allDifferent: true,
|
|
156
|
+
}).sort((a, b) => a - b);
|
|
157
|
+
const serie1Next = randTupleInt(4 - serie1Index, {
|
|
158
|
+
from: b + 1,
|
|
159
|
+
to: 30,
|
|
160
|
+
allDifferent: true,
|
|
161
|
+
}).sort((a, b) => a - b);
|
|
162
|
+
const serie2Next = randTupleInt(4 - serie2Index, {
|
|
163
|
+
from: b + 1,
|
|
164
|
+
to: 30,
|
|
165
|
+
allDifferent: true,
|
|
166
|
+
}).sort((a, b) => a - b);
|
|
167
|
+
serie1 = [...serie1Prev, b, ...serie1Next];
|
|
168
|
+
serie2 = [...serie2Prev, b, ...serie2Next];
|
|
169
|
+
}
|
|
149
170
|
const identifiers = { labels, serie1, serie2, a, b, isBetween };
|
|
150
171
|
return getQuestionFromIdentifiers(identifiers);
|
|
151
172
|
};
|
package/lib/index.d.ts
CHANGED