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.
@@ -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;AAoGF,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,WAAW,CAclD,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,
@@ -3,7 +3,7 @@ type Identifiers = {
3
3
  labels: string[];
4
4
  serie1: number[];
5
5
  serie2: number[];
6
- a: number;
6
+ a?: number;
7
7
  b: number;
8
8
  isBetween: boolean;
9
9
  };
@@ -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;AAQrC,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAwMF,eAAO,MAAM,6BAA6B,EAAE,QAAQ,CAAC,WAAW,CAqB/D,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
- const mainSeries = serie1.includes(b) ? serie1 : serie2;
17
- const otherSeries = mainSeries === serie1 ? serie2 : serie1;
18
- const indexOfB = mainSeries.indexOf(b);
19
- const indexOfA = mainSeries.indexOf(a);
20
- const diff = indexOfB - indexOfA + 1;
21
- let count = 0;
22
- for (let idx = 0; idx < otherSeries.length; idx++) {
23
- const val = otherSeries[idx];
24
- if (isBetween) {
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 isBInSerie1 = serie1.includes(b);
64
- const mainSeries = isBInSerie1 ? serie1 : serie2;
65
- const otherSeries = isBInSerie1 ? serie2 : serie1;
66
- const mainSeriesLabel = isBInSerie1 ? "série $1$" : "série $2$";
67
- const otherSeriesLabel = isBInSerie1 ? "série $2$" : "série $1$";
68
- const indexOfA = mainSeries.indexOf(a);
69
- const indexOfB = mainSeries.indexOf(b);
70
- let i = 0;
71
- for (let idx = 0; idx < otherSeries.length; idx++) {
72
- const val = otherSeries[idx];
73
- if (isBetween) {
74
- if ((val >= a || otherSeries[idx + 1] > a) &&
75
- (val <= b || otherSeries[idx - 1] < b)) {
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
- const quartilePercentages = [0, 25, 50, 75, 100];
86
- const labelA = labels[indexOfA];
87
- const labelB = labels[indexOfB];
88
- const valueA = a;
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
- - Dans la ${mainSeriesLabel}, on a $${labelA} = ${valueA}$ et $${labelB} = ${valueB}$, donc ${proportionB}
111
- - Dans la ${otherSeriesLabel}, on a $${labelA} = ${otherSeries[indexOfA]}$ et $${labelB} = ${otherSeries[indexOfB]}$, donc ${proportionOther}
112
-
113
- ${comparison}`
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
- const min = randint(0, 10);
141
- const serie1 = makeQuartileSeries(min);
142
- const serie2 = makeQuartileSeries(min, serie1);
85
+ let a = undefined;
86
+ let b;
87
+ let serie1;
88
+ let serie2;
143
89
  const isBetween = coinFlip();
144
- const chosenSerie = coinFlip() ? serie1 : serie2;
145
- const indexOfA = randint(0, serie1.length - (isBetween ? 1 : 2));
146
- const a = chosenSerie[indexOfA];
147
- const indexOfB = randint(indexOfA + 1, isBetween ? chosenSerie.length : chosenSerie.length - 1);
148
- const b = chosenSerie[indexOfB];
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
@@ -2061,7 +2061,7 @@ declare const mathExercises: (Exercise<{
2061
2061
  labels: string[];
2062
2062
  serie1: number[];
2063
2063
  serie2: number[];
2064
- a: number;
2064
+ a?: number;
2065
2065
  b: number;
2066
2066
  isBetween: boolean;
2067
2067
  }, {}> | Exercise<{
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "math-exercises",
3
3
  "type": "module",
4
- "version": "3.0.103",
4
+ "version": "3.0.105",
5
5
  "description": "Math exercises generator for middle school and high school",
6
6
  "main": "lib/index.js",
7
7
  "files": [