math-exercises 3.0.139 → 3.0.141
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/calcul/arithmetics/euclideanDivision.d.ts.map +1 -1
- package/lib/exercises/math/calcul/arithmetics/euclideanDivision.js +65 -8
- package/lib/exercises/math/calcul/arithmetics/findRightPrimeDecomposition.d.ts.map +1 -1
- package/lib/exercises/math/calcul/arithmetics/findRightPrimeDecomposition.js +3 -6
- package/lib/exercises/math/calcul/arithmetics/index.d.ts +3 -0
- package/lib/exercises/math/calcul/arithmetics/index.d.ts.map +1 -1
- package/lib/exercises/math/calcul/arithmetics/index.js +3 -1
- package/lib/exercises/math/calcul/arithmetics/primeNumbersAffirmations.d.ts +8 -0
- package/lib/exercises/math/calcul/arithmetics/primeNumbersAffirmations.d.ts.map +1 -0
- package/lib/exercises/math/calcul/arithmetics/primeNumbersAffirmations.js +128 -0
- package/lib/exercises/math/calcul/proportionality/fourthProportionalFromProblem.d.ts +8 -0
- package/lib/exercises/math/calcul/proportionality/fourthProportionalFromProblem.d.ts.map +1 -0
- package/lib/exercises/math/calcul/proportionality/fourthProportionalFromProblem.js +392 -0
- package/lib/exercises/math/calcul/proportionality/index.d.ts +2 -0
- package/lib/exercises/math/calcul/proportionality/index.d.ts.map +1 -1
- package/lib/exercises/math/calcul/proportionality/index.js +2 -0
- package/lib/exercises/math/calcul/proportionality/isProportionalFromProblem.d.ts +8 -0
- package/lib/exercises/math/calcul/proportionality/isProportionalFromProblem.d.ts.map +1 -0
- package/lib/exercises/math/calcul/proportionality/isProportionalFromProblem.js +349 -0
- package/lib/exercises/math/calculLitteral/equation/isEqualityTrue.js +4 -4
- package/lib/exercises/math/dataRepresentations/index.js +1 -0
- package/lib/exercises/math/dataRepresentations/placePointsFromDataTable.d.ts +12 -0
- package/lib/exercises/math/dataRepresentations/placePointsFromDataTable.d.ts.map +1 -0
- package/lib/exercises/math/dataRepresentations/placePointsFromDataTable.js +175 -0
- package/lib/exercises/math/functions/affines/index.d.ts +2 -0
- package/lib/exercises/math/functions/affines/index.d.ts.map +1 -1
- package/lib/exercises/math/functions/affines/index.js +2 -0
- package/lib/exercises/math/functions/affines/placePointsFromAffine.d.ts +8 -0
- package/lib/exercises/math/functions/affines/placePointsFromAffine.d.ts.map +1 -0
- package/lib/exercises/math/functions/affines/placePointsFromAffine.js +135 -0
- package/lib/exercises/math/functions/affines/recognizeAffinePointsFromPoints.d.ts +10 -0
- package/lib/exercises/math/functions/affines/recognizeAffinePointsFromPoints.d.ts.map +1 -0
- package/lib/exercises/math/functions/affines/recognizeAffinePointsFromPoints.js +208 -0
- package/lib/exercises/math/functions/basics/index.d.ts +1 -0
- package/lib/exercises/math/functions/basics/index.d.ts.map +1 -1
- package/lib/exercises/math/functions/basics/index.js +1 -0
- package/lib/exercises/math/functions/basics/placePointsFromValueTable.d.ts +8 -0
- package/lib/exercises/math/functions/basics/placePointsFromValueTable.d.ts.map +1 -0
- package/lib/exercises/math/functions/basics/placePointsFromValueTable.js +128 -0
- package/lib/exercises/math/geometry/pythagore/isTriangleRight.d.ts.map +1 -1
- package/lib/exercises/math/geometry/pythagore/isTriangleRight.js +19 -9
- package/lib/exercises/utils/data/boxXY.d.ts +7 -0
- package/lib/exercises/utils/data/boxXY.d.ts.map +1 -0
- package/lib/exercises/utils/data/boxXY.js +16 -0
- package/lib/exercises/utils/data/isBoxable.d.ts +2 -0
- package/lib/exercises/utils/data/isBoxable.d.ts.map +1 -0
- package/lib/exercises/utils/data/isBoxable.js +5 -0
- package/lib/exercises/utils/data/randomDataTable.d.ts +11 -0
- package/lib/exercises/utils/data/randomDataTable.d.ts.map +1 -0
- package/lib/exercises/utils/data/randomDataTable.js +65 -0
- package/lib/index.d.ts +21 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/math/utils/random/randfloat.d.ts +1 -0
- package/lib/math/utils/random/randfloat.d.ts.map +1 -1
- package/lib/math/utils/random/randfloat.js +35 -0
- package/lib/utils/arrays/transpose.d.ts +2 -0
- package/lib/utils/arrays/transpose.d.ts.map +1 -0
- package/lib/utils/arrays/transpose.js +10 -0
- package/package.json +1 -1
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
import { addValidProp, tryToAddWrongProp, } from "../../../../exercises/exercise.js";
|
|
2
|
+
import { getDistinctQuestions } from "../../../../exercises/utils/getDistinctQuestions.js";
|
|
3
|
+
import { primes } from "../../../../math/numbers/integer/primes.js";
|
|
4
|
+
import { dividersOf } from "../../../../math/utils/arithmetic/dividersOf.js";
|
|
5
|
+
import { randfloat } from "../../../../math/utils/random/randfloat.js";
|
|
6
|
+
import { randint } from "../../../../math/utils/random/randint.js";
|
|
7
|
+
import { round } from "../../../../math/utils/round.js";
|
|
8
|
+
import { frac } from "../../../../tree/nodes/operators/fractionNode.js";
|
|
9
|
+
import { multiply } from "../../../../tree/nodes/operators/multiplyNode.js";
|
|
10
|
+
import { substract } from "../../../../tree/nodes/operators/substractNode.js";
|
|
11
|
+
import { coinFlip } from "../../../../utils/alea/coinFlip.js";
|
|
12
|
+
import { random } from "../../../../utils/alea/random.js";
|
|
13
|
+
import { intersect } from "../../../../utils/arrays/arrayIntersection.js";
|
|
14
|
+
import { mdTable } from "../../../../utils/markdown/mdTable.js";
|
|
15
|
+
const roundToForDisplay = 7; //tristesse un peu
|
|
16
|
+
const situations = [
|
|
17
|
+
{
|
|
18
|
+
instruction: (values) => `Chez un pépiniériste, un cerisier d'une hauteur de $${values[0][0].frenchify()}$ $\\textrm{cm}$ coûte $${values[1][0].frenchify()}$ $\\textrm{€}$
|
|
19
|
+
et un cerisier d'une hauteur de $${values[0][1].frenchify()}$ $\\textrm{cm}$ coûte $${values[1][1].frenchify()}$ $\\textrm{€}$.
|
|
20
|
+
Le prix du cerisier est-il proportionnel à sa hauteur ?`,
|
|
21
|
+
correction: (values) => {
|
|
22
|
+
const m1 = multiply(values[0][0], values[1][1]);
|
|
23
|
+
const m2 = multiply(values[1][0], values[0][1]);
|
|
24
|
+
const isPropor = isProportional(values);
|
|
25
|
+
return `On peut dresser le tableau suivant:
|
|
26
|
+
${mdTable([
|
|
27
|
+
["Cerisiers", ...values[0].map(() => "")],
|
|
28
|
+
[
|
|
29
|
+
"Hauteur ($\\textrm{cm}$)",
|
|
30
|
+
...values[0].map((value) => `$${value.frenchify()}$`),
|
|
31
|
+
],
|
|
32
|
+
[
|
|
33
|
+
"Prix ($\\textrm{€}$)",
|
|
34
|
+
...values[1].map((value) => `$${value.frenchify()}$`),
|
|
35
|
+
],
|
|
36
|
+
])}
|
|
37
|
+
|
|
38
|
+
On va comparer les produits en croix :
|
|
39
|
+
|
|
40
|
+
$$
|
|
41
|
+
${values[0][0].frenchify()} \\times ${values[1][1].frenchify()} = ${round(m1.evaluate(), roundToForDisplay).frenchify()}
|
|
42
|
+
$$
|
|
43
|
+
|
|
44
|
+
$$
|
|
45
|
+
${values[1][0].frenchify()} \\times ${values[0][1].frenchify()} = ${round(m2.evaluate(), roundToForDisplay).frenchify()}
|
|
46
|
+
$$
|
|
47
|
+
|
|
48
|
+
${isPropor
|
|
49
|
+
? `Les produits en croix sont égaux.
|
|
50
|
+
Le prix du cerisier est donc proportionnel à sa hauteur.`
|
|
51
|
+
: `Les produits en croix sont différents.
|
|
52
|
+
Le prix du cerisier n'est donc pas proportionnel à sa hauteur.`}`;
|
|
53
|
+
},
|
|
54
|
+
randValues: (isProportional) => {
|
|
55
|
+
const nbValues = 2;
|
|
56
|
+
const roundTo = 2;
|
|
57
|
+
const valuesA = [...Array(nbValues + 1).keys()].reduce((acc) => [...acc, randint(70, 150, acc)], []);
|
|
58
|
+
const coeff = randfloat(0.4, 0.7, roundTo);
|
|
59
|
+
const valuesB = valuesA.map((valueA) => round(valueA * coeff, roundTo));
|
|
60
|
+
if (isProportional) {
|
|
61
|
+
return [valuesA.slice(0, nbValues), valuesB.slice(0, nbValues)];
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
return [valuesA.slice(0, nbValues), [valuesB[0], ...valuesB.slice(2)]];
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
instruction: (values) => `Samedi, Margot a consommé $${values[0][0].frenchify()}$ litres d'essence pour parcourir $${values[1][0].frenchify()}$ $\\textrm{km}$.
|
|
70
|
+
Dimanche, elle a parcouru $${values[1][1].frenchify()}$ $\\textrm{km}$ avec $${values[0][1].frenchify()}$ litres d'essence.
|
|
71
|
+
La distance parcourue est-elle proportionnelle à la consommation d'essence ?`,
|
|
72
|
+
correction: (values) => {
|
|
73
|
+
const m1 = multiply(values[0][0], values[1][1]);
|
|
74
|
+
const m2 = multiply(values[1][0], values[0][1]);
|
|
75
|
+
const isPropor = isProportional(values);
|
|
76
|
+
return `On peut dresser le tableau suivant:
|
|
77
|
+
${mdTable([
|
|
78
|
+
["Margot", ...values[0].map(() => "")],
|
|
79
|
+
["Jour", "Samedi", "Dimanche"],
|
|
80
|
+
[
|
|
81
|
+
"Consommation ($\\textrm{L}$)",
|
|
82
|
+
...values[0].map((value) => `$${value.frenchify()}$`),
|
|
83
|
+
],
|
|
84
|
+
[
|
|
85
|
+
"Distance ($\\textrm{km}$)",
|
|
86
|
+
...values[1].map((value) => `$${value.frenchify()}$`),
|
|
87
|
+
],
|
|
88
|
+
])}
|
|
89
|
+
|
|
90
|
+
On va comparer les produits en croix :
|
|
91
|
+
|
|
92
|
+
$$
|
|
93
|
+
${values[0][0].frenchify()} \\times ${values[1][1].frenchify()} = ${round(m1.evaluate(), roundToForDisplay).frenchify()}
|
|
94
|
+
$$
|
|
95
|
+
|
|
96
|
+
$$
|
|
97
|
+
${values[1][0].frenchify()} \\times ${values[0][1].frenchify()} = ${round(m2.evaluate(), roundToForDisplay).frenchify()}
|
|
98
|
+
$$
|
|
99
|
+
|
|
100
|
+
${isPropor
|
|
101
|
+
? `Les produits en croix sont égaux.
|
|
102
|
+
La distance parcourue est proportionnelle à la consommation d'essence.`
|
|
103
|
+
: `Les produits en croix sont différents.
|
|
104
|
+
La distance parcourue n'est pas proportionnelle à la consommation d'essence.`}`;
|
|
105
|
+
},
|
|
106
|
+
randValues: (isProportional) => {
|
|
107
|
+
const nbValues = 2;
|
|
108
|
+
const roundTo = 1;
|
|
109
|
+
const valuesA = [...Array(nbValues + 1).keys()].reduce((acc) => [...acc, randint(5, 50, acc)], []);
|
|
110
|
+
const coeff = randfloat(10, 30, roundTo);
|
|
111
|
+
const valuesB = valuesA.map((valueA) => round(valueA * coeff, roundTo));
|
|
112
|
+
if (isProportional) {
|
|
113
|
+
return [valuesA.slice(0, nbValues), valuesB.slice(0, nbValues)];
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
return [valuesA.slice(0, nbValues), [valuesB[0], ...valuesB.slice(2)]];
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
instruction: (values) => `Jérome dirige deux casses automobiles.
|
|
122
|
+
Dans la première, il y a $${values[0][0].frenchify()}$ épaves et $${values[1][0].frenchify()}$ pneus.
|
|
123
|
+
Dans la deuxième, il y a $${values[0][1].frenchify()}$ épaves et $${values[1][1].frenchify()}$ pneus.
|
|
124
|
+
Le nombre d'épaves est-il proportionnel au nombre de pneus ?`,
|
|
125
|
+
correction: (values) => {
|
|
126
|
+
const m1 = multiply(values[0][0], values[1][1]);
|
|
127
|
+
const m2 = multiply(values[1][0], values[0][1]);
|
|
128
|
+
const isPropor = isProportional(values);
|
|
129
|
+
return `On peut dresser le tableau suivant:
|
|
130
|
+
${mdTable([
|
|
131
|
+
["Jérome", ...values[0].map(() => "")],
|
|
132
|
+
["Casses", "Casse $1$", "Casse $2$"],
|
|
133
|
+
["Épaves", ...values[0].map((value) => `$${value.frenchify()}$`)],
|
|
134
|
+
["Pneus", ...values[1].map((value) => `$${value.frenchify()}$`)],
|
|
135
|
+
])}
|
|
136
|
+
|
|
137
|
+
On va comparer les produits en croix :
|
|
138
|
+
|
|
139
|
+
$$
|
|
140
|
+
${values[0][0].frenchify()} \\times ${values[1][1].frenchify()} = ${round(m1.evaluate(), roundToForDisplay).frenchify()}
|
|
141
|
+
$$
|
|
142
|
+
|
|
143
|
+
$$
|
|
144
|
+
${values[1][0].frenchify()} \\times ${values[0][1].frenchify()} = ${round(m2.evaluate(), roundToForDisplay).frenchify()}
|
|
145
|
+
$$
|
|
146
|
+
|
|
147
|
+
${isPropor
|
|
148
|
+
? `Les produits en croix sont égaux.
|
|
149
|
+
Le nombre d'épaves est proportionnel au nombre de pneus.`
|
|
150
|
+
: `Les produits en croix sont différents.
|
|
151
|
+
Le nombre d'épaves n'est pas proportionnel au nombre de pneus.`}`;
|
|
152
|
+
},
|
|
153
|
+
randValues: (isProportional) => {
|
|
154
|
+
const nbValues = 2;
|
|
155
|
+
const valuesA = [...Array(nbValues + 1).keys()].reduce((acc) => [...acc, randint(5, 50, acc)], []);
|
|
156
|
+
const coeff = randint(8, 37);
|
|
157
|
+
const valuesB = valuesA.map((valueA) => valueA * coeff);
|
|
158
|
+
if (isProportional) {
|
|
159
|
+
return [valuesA.slice(0, nbValues), valuesB.slice(0, nbValues)];
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
return [valuesA.slice(0, nbValues), [valuesB[0], ...valuesB.slice(2)]];
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
instruction: (values) => `Alassan joue à un jeu vidéo sur son ordinateur.
|
|
168
|
+
Dans une première session, il a gagné $${values[1][0].frenchify()}$ niveaux en $${values[0][0].frenchify()}$ $\\textrm{min}$.
|
|
169
|
+
Dans une autre session, en $${values[0][1].frenchify()}$ $\\textrm{min}$, il a gagné $${values[1][1].frenchify()}$ niveaux.
|
|
170
|
+
Le nombre de niveaux gagnés est-il proportionnel à la durée de jeu ?`,
|
|
171
|
+
correction: (values) => {
|
|
172
|
+
const m1 = multiply(values[0][0], values[1][1]);
|
|
173
|
+
const m2 = multiply(values[1][0], values[0][1]);
|
|
174
|
+
const isPropor = isProportional(values);
|
|
175
|
+
return `On peut dresser le tableau suivant:
|
|
176
|
+
${mdTable([
|
|
177
|
+
["Alassan", ...values[0].map(() => "")],
|
|
178
|
+
["Sessions", "Session $1$", "Session $2$"],
|
|
179
|
+
[
|
|
180
|
+
"Durée de jeu ($\\textrm{min}$)",
|
|
181
|
+
...values[0].map((value) => `$${value.frenchify()}$`),
|
|
182
|
+
],
|
|
183
|
+
[
|
|
184
|
+
"Nombre de niveaux gagnés",
|
|
185
|
+
...values[1].map((value) => `$${value.frenchify()}$`),
|
|
186
|
+
],
|
|
187
|
+
])}
|
|
188
|
+
|
|
189
|
+
On va comparer les produits en croix :
|
|
190
|
+
|
|
191
|
+
$$
|
|
192
|
+
${values[0][0].frenchify()} \\times ${values[1][1].frenchify()} = ${round(m1.evaluate(), roundToForDisplay).frenchify()}
|
|
193
|
+
$$
|
|
194
|
+
|
|
195
|
+
$$
|
|
196
|
+
${values[1][0].frenchify()} \\times ${values[0][1].frenchify()} = ${round(m2.evaluate(), roundToForDisplay).frenchify()}
|
|
197
|
+
$$
|
|
198
|
+
|
|
199
|
+
${isPropor
|
|
200
|
+
? `Les produits en croix sont égaux.
|
|
201
|
+
Le nombre de niveaux gagnés est proportionnel à la durée de jeu.`
|
|
202
|
+
: `Les produits en croix sont différents.
|
|
203
|
+
Le nombre de niveaux gagnés n'est pas proportionnel à la durée de jeu.`}`;
|
|
204
|
+
},
|
|
205
|
+
randValues: (isProportional) => {
|
|
206
|
+
const nbValues = 2;
|
|
207
|
+
let valuesA;
|
|
208
|
+
let valuesB;
|
|
209
|
+
let counter = -1;
|
|
210
|
+
let isValid = false;
|
|
211
|
+
while (!isValid && counter < 100) {
|
|
212
|
+
counter++;
|
|
213
|
+
valuesA = [...Array(nbValues + 1).keys()].reduce((acc) => [...acc, randint(15, 120, [...acc, ...primes])], []);
|
|
214
|
+
const commonDivisors = intersect(valuesA.map((valueA) => dividersOf(valueA)));
|
|
215
|
+
isValid = commonDivisors.length > 1;
|
|
216
|
+
const randomCommonDivisor = commonDivisors.length > 1
|
|
217
|
+
? random(commonDivisors.slice(1))
|
|
218
|
+
: commonDivisors[0];
|
|
219
|
+
const coeff = frac(randint(1, randomCommonDivisor), randomCommonDivisor);
|
|
220
|
+
valuesB = valuesA.map((valueA) => multiply(valueA, coeff).simplify().evaluate());
|
|
221
|
+
}
|
|
222
|
+
if (isProportional) {
|
|
223
|
+
return [valuesA.slice(0, nbValues), valuesB.slice(0, nbValues)];
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
return [
|
|
227
|
+
valuesA.slice(0, nbValues),
|
|
228
|
+
[valuesB[0], ...valuesB.slice(2)],
|
|
229
|
+
];
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
instruction: (values) => `Dans un village, il y a $${values[0][0].frenchify()}$ terrains de pétanque et $${values[1][0].frenchify()}$ retraités.
|
|
235
|
+
Dans un autre village, il y a $${values[0][1].frenchify()}$ terrains de pétanque et $${values[1][1].frenchify()}$ retraités.
|
|
236
|
+
Le nombre de terrains de pétanque est-il proportionnel au nombre de retraités ?`,
|
|
237
|
+
correction: (values) => {
|
|
238
|
+
const m1 = multiply(values[0][0], values[1][1]);
|
|
239
|
+
const m2 = multiply(values[1][0], values[0][1]);
|
|
240
|
+
const isPropor = isProportional(values);
|
|
241
|
+
return `On peut dresser le tableau suivant:
|
|
242
|
+
${mdTable([
|
|
243
|
+
["Pétanque", ...values[0].map(() => "")],
|
|
244
|
+
["Village", "Village $1$", "Village $2$"],
|
|
245
|
+
["Terrains", ...values[0].map((value) => `$${value.frenchify()}$`)],
|
|
246
|
+
["Retraités", ...values[1].map((value) => `$${value.frenchify()}$`)],
|
|
247
|
+
])}
|
|
248
|
+
|
|
249
|
+
On va comparer les produits en croix :
|
|
250
|
+
|
|
251
|
+
$$
|
|
252
|
+
${values[0][0].frenchify()} \\times ${values[1][1].frenchify()} = ${round(m1.evaluate(), roundToForDisplay).frenchify()}
|
|
253
|
+
$$
|
|
254
|
+
|
|
255
|
+
$$
|
|
256
|
+
${values[1][0].frenchify()} \\times ${values[0][1].frenchify()} = ${round(m2.evaluate(), roundToForDisplay).frenchify()}
|
|
257
|
+
$$
|
|
258
|
+
|
|
259
|
+
${isPropor
|
|
260
|
+
? `Les produits en croix sont égaux.
|
|
261
|
+
Le nombre de terrains de pétanque est proportionnel au nombre de retraités.`
|
|
262
|
+
: `Les produits en croix sont différents.
|
|
263
|
+
Le nombre de terrains de pétanque n'est pas proportionnel au nombre de retraités.`}`;
|
|
264
|
+
},
|
|
265
|
+
randValues: (isProportional) => {
|
|
266
|
+
const nbValues = 2;
|
|
267
|
+
const valuesA = [...Array(nbValues + 1).keys()].reduce((acc) => [...acc, randint(3, 30, acc)], []);
|
|
268
|
+
const coeff = randint(8, 37);
|
|
269
|
+
const valuesB = valuesA.map((valueA) => valueA * coeff);
|
|
270
|
+
if (isProportional) {
|
|
271
|
+
return [valuesA.slice(0, nbValues), valuesB.slice(0, nbValues)];
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
return [valuesA.slice(0, nbValues), [valuesB[0], ...valuesB.slice(2)]];
|
|
275
|
+
}
|
|
276
|
+
},
|
|
277
|
+
},
|
|
278
|
+
];
|
|
279
|
+
const isProportional = (values) => {
|
|
280
|
+
const m1 = multiply(values[0][0], values[1][1]);
|
|
281
|
+
const m2 = multiply(values[1][0], values[0][1]);
|
|
282
|
+
return round(substract(m1, m2).evaluate(), roundToForDisplay) === 0;
|
|
283
|
+
};
|
|
284
|
+
const getPropositions = (_, { answer, ...identifiers }) => {
|
|
285
|
+
const propositions = [];
|
|
286
|
+
const answerFromIdentifiers = getAnswer(identifiers);
|
|
287
|
+
["Oui", "Non"].forEach((strProp) => {
|
|
288
|
+
if (strProp === answerFromIdentifiers) {
|
|
289
|
+
addValidProp(propositions, strProp);
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
tryToAddWrongProp(propositions, strProp);
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
return propositions;
|
|
296
|
+
};
|
|
297
|
+
const getAnswer = (identifiers) => {
|
|
298
|
+
const { values } = identifiers;
|
|
299
|
+
return isProportional(values) ? "Oui" : "Non";
|
|
300
|
+
};
|
|
301
|
+
const getInstruction = (identifiers) => {
|
|
302
|
+
const { situationIndex, values } = identifiers;
|
|
303
|
+
const situation = situations[situationIndex];
|
|
304
|
+
return situation.instruction(values);
|
|
305
|
+
};
|
|
306
|
+
const getHint = () => {
|
|
307
|
+
return `Que doivent vérifier les valeurs données s'il y a proportionnalité ?`;
|
|
308
|
+
};
|
|
309
|
+
const getCorrection = (identifiers) => {
|
|
310
|
+
const { situationIndex, values } = identifiers;
|
|
311
|
+
const situation = situations[situationIndex];
|
|
312
|
+
return situation.correction(values);
|
|
313
|
+
};
|
|
314
|
+
const getIsProportionalFromProblemQuestion = () => {
|
|
315
|
+
const situationIndex = randint(0, situations.length);
|
|
316
|
+
const situation = situations[situationIndex];
|
|
317
|
+
const isProportional = coinFlip();
|
|
318
|
+
const values = situation.randValues(isProportional);
|
|
319
|
+
const identifiers = { situationIndex, values };
|
|
320
|
+
return getQuestionFromIdentifiers(identifiers);
|
|
321
|
+
};
|
|
322
|
+
const getQuestionFromIdentifiers = (identifiers) => {
|
|
323
|
+
return {
|
|
324
|
+
answer: getAnswer(identifiers),
|
|
325
|
+
instruction: getInstruction(identifiers),
|
|
326
|
+
keys: [],
|
|
327
|
+
answerFormat: "tex",
|
|
328
|
+
identifiers,
|
|
329
|
+
hint: getHint(identifiers),
|
|
330
|
+
correction: getCorrection(identifiers),
|
|
331
|
+
};
|
|
332
|
+
};
|
|
333
|
+
export const isProportionalFromProblem = {
|
|
334
|
+
id: "isProportionalFromProblem",
|
|
335
|
+
label: "Reconnaître une situation de proportionnalité à partir d'un énoncé",
|
|
336
|
+
isSingleStep: true,
|
|
337
|
+
generator: (nb, opts) => getDistinctQuestions(() => getIsProportionalFromProblemQuestion(opts), nb),
|
|
338
|
+
qcmTimer: 60,
|
|
339
|
+
freeTimer: 60,
|
|
340
|
+
getPropositions,
|
|
341
|
+
subject: "Mathématiques",
|
|
342
|
+
getInstruction,
|
|
343
|
+
getHint,
|
|
344
|
+
getCorrection,
|
|
345
|
+
getAnswer,
|
|
346
|
+
getQuestionFromIdentifiers,
|
|
347
|
+
hasHintAndCorrection: true,
|
|
348
|
+
answerType: "QCU",
|
|
349
|
+
};
|
|
@@ -21,10 +21,10 @@ const getPropositions = (_, { answer }) => {
|
|
|
21
21
|
const propositions = [];
|
|
22
22
|
["Oui", "Non"].forEach((strYN) => {
|
|
23
23
|
if (strYN === answer) {
|
|
24
|
-
addValidProp(propositions, strYN);
|
|
24
|
+
addValidProp(propositions, strYN, "raw");
|
|
25
25
|
}
|
|
26
26
|
else {
|
|
27
|
-
tryToAddWrongProp(propositions, strYN);
|
|
27
|
+
tryToAddWrongProp(propositions, strYN, "raw");
|
|
28
28
|
}
|
|
29
29
|
});
|
|
30
30
|
return propositions;
|
|
@@ -140,7 +140,7 @@ const getIsEqualityTrue1Question = (optsIn) => {
|
|
|
140
140
|
while (!isFound && counter < 100) {
|
|
141
141
|
counter++;
|
|
142
142
|
const num = randint(-9, 10);
|
|
143
|
-
const den = randint(0, 10, [0, num]);
|
|
143
|
+
const den = randint(0, 10, [0, 1, num]);
|
|
144
144
|
const fractionNode = frac(num, den);
|
|
145
145
|
const isExcluded = excludes.some((excludedNode) => substract(excludedNode, fractionNode).evaluate() === 0);
|
|
146
146
|
if (!isExcluded) {
|
|
@@ -264,7 +264,7 @@ const getQuestionFromIdentifiers = (identifiers, opts) => {
|
|
|
264
264
|
answer: getAnswer(identifiers, opts),
|
|
265
265
|
instruction: getInstruction(identifiers, opts),
|
|
266
266
|
keys: getKeys(identifiers, opts),
|
|
267
|
-
answerFormat: "
|
|
267
|
+
answerFormat: "raw",
|
|
268
268
|
identifiers,
|
|
269
269
|
hint: getHint(identifiers, opts),
|
|
270
270
|
correction: getCorrection(identifiers, opts),
|
|
@@ -15,6 +15,7 @@ export * from "./graphReading.js";
|
|
|
15
15
|
export * from "./plausibleGraph.js";
|
|
16
16
|
export * from "./halfPieChartReading.js";
|
|
17
17
|
export * from "./halfPieChartCommenting.js";
|
|
18
|
+
// export * from "./placePointsFromDataTable.js";
|
|
18
19
|
// export * from "./testGen.js";
|
|
19
20
|
// export * from "./testGenGGB.js";
|
|
20
21
|
// export * from "./testGenStudentGGB.js";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Exercise } from "../../../exercises/exercise.js";
|
|
2
|
+
import { NodeIdentifiers } from "../../../tree/nodes/nodeConstructor.js";
|
|
3
|
+
type Identifiers = {
|
|
4
|
+
isRowBased: boolean;
|
|
5
|
+
rowBasedDataTable: string[][];
|
|
6
|
+
indexX: number;
|
|
7
|
+
indexY: number;
|
|
8
|
+
arrCoordsAsNodeIds: NodeIdentifiers[][];
|
|
9
|
+
};
|
|
10
|
+
export declare const placePointsFromDataTable: Exercise<Identifiers>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=placePointsFromDataTable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"placePointsFromDataTable.d.ts","sourceRoot":"","sources":["../../../../src/exercises/math/dataRepresentations/placePointsFromDataTable.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAST,MAAM,6BAA6B,CAAC;AAWrC,OAAO,EAEL,eAAe,EAChB,MAAM,qCAAqC,CAAC;AAiB7C,KAAK,WAAW,GAAG;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB,EAAE,MAAM,EAAE,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,eAAe,EAAE,EAAE,CAAC;CACzC,CAAC;AAyOF,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,WAAW,CAiB1D,CAAC"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { boxXY } from "../../../exercises/utils/data/boxXY.js";
|
|
2
|
+
import { isBoxable } from "../../../exercises/utils/data/isBoxable.js";
|
|
3
|
+
import { randomDataTable } from "../../../exercises/utils/data/randomDataTable.js";
|
|
4
|
+
import { toolBarConstructor } from "../../../exercises/utils/geogebra/toolBarConstructor.js";
|
|
5
|
+
import { getDistinctQuestions } from "../../../exercises/utils/getDistinctQuestions.js";
|
|
6
|
+
import { greenMain } from "../../../geogebra/colors.js";
|
|
7
|
+
import { GeogebraConstructor } from "../../../geogebra/geogebraConstructor.js";
|
|
8
|
+
import { GeogebraParser } from "../../../geogebra/parsers/geogebraParser.js";
|
|
9
|
+
import { Point } from "../../../math/geometry/point.js";
|
|
10
|
+
import { NodeConstructor, } from "../../../tree/nodes/nodeConstructor.js";
|
|
11
|
+
import { parseAlgebraic } from "../../../tree/parsers/latexParser.js";
|
|
12
|
+
import { coinFlip } from "../../../utils/alea/coinFlip.js";
|
|
13
|
+
import { randomMany } from "../../../utils/alea/random.js";
|
|
14
|
+
import { transpose } from "../../../utils/arrays/transpose.js";
|
|
15
|
+
import { mdTable } from "../../../utils/markdown/mdTable.js";
|
|
16
|
+
import { joinanded } from "../../../utils/strings/joinanded.js";
|
|
17
|
+
const getStrGraphName = (identifiers) => {
|
|
18
|
+
const { rowBasedDataTable, indexX, indexY } = identifiers;
|
|
19
|
+
const [nameTexX, nameTexY] = [indexX, indexY].map((i) => rowBasedDataTable[i][0]);
|
|
20
|
+
const graphName = `${nameTexY} en fonction de ${nameTexX}`;
|
|
21
|
+
return graphName;
|
|
22
|
+
};
|
|
23
|
+
const getDataTable = (identifiers) => {
|
|
24
|
+
const { isRowBased, rowBasedDataTable } = identifiers;
|
|
25
|
+
return isRowBased ? rowBasedDataTable : transpose(rowBasedDataTable);
|
|
26
|
+
};
|
|
27
|
+
const getInstruction = (identifiers) => {
|
|
28
|
+
const { isRowBased } = identifiers;
|
|
29
|
+
const dataTable = getDataTable(identifiers);
|
|
30
|
+
return `À partir du tableau de données ci-dessous, placer les points du graphique "${getStrGraphName(identifiers)}".
|
|
31
|
+
|
|
32
|
+
${isRowBased
|
|
33
|
+
? mdTable([
|
|
34
|
+
[...Array(dataTable[0].length).keys()].map((i) => i === 0 ? "Données" : ""),
|
|
35
|
+
...getDataTable(identifiers),
|
|
36
|
+
])
|
|
37
|
+
: mdTable(getDataTable(identifiers))}
|
|
38
|
+
|
|
39
|
+
`;
|
|
40
|
+
};
|
|
41
|
+
const getHint = () => {
|
|
42
|
+
return `Quand on construit un graphique "$A$ en fonction de $B$", $A$ se lira sur l'axe des ordonnées et $B$ sur l'axe des abscisses.`;
|
|
43
|
+
};
|
|
44
|
+
const getCorrection = (identifiers) => {
|
|
45
|
+
const { rowBasedDataTable, indexX, indexY } = identifiers;
|
|
46
|
+
const [nameTexX, nameTexY] = [indexX, indexY].map((i) => rowBasedDataTable[i][0]);
|
|
47
|
+
const solutionPoints = getSolutionPoints(identifiers);
|
|
48
|
+
return `On place chaque point de coordonnées (${nameTexX};${nameTexY}).
|
|
49
|
+
|
|
50
|
+
On place donc les points de coordonnées ${joinanded(solutionPoints.map((p) => `$(${p.x.toTex()};${p.y.toTex()})$`), ", ", " et ")}.`;
|
|
51
|
+
};
|
|
52
|
+
const getSolutionPoints = (identifiers) => {
|
|
53
|
+
const { arrCoordsAsNodeIds } = identifiers;
|
|
54
|
+
const arrCoordsAsNodes = arrCoordsAsNodeIds.map(([nodeIdsX, nodeIdsY]) => [nodeIdsX, nodeIdsY].map((nodeIds) => NodeConstructor.fromIdentifiers(nodeIds)));
|
|
55
|
+
return arrCoordsAsNodes.map(([nodeX, nodeY], i) => {
|
|
56
|
+
return new Point(`S_${i}`, nodeX, nodeY);
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
const getGGBAnswer = (identifiers) => {
|
|
60
|
+
const solutionPoints = getSolutionPoints(identifiers);
|
|
61
|
+
return [
|
|
62
|
+
...solutionPoints.flatMap((point) => point.toGGBCommand({ color: `${greenMain}`, showLabel: false })),
|
|
63
|
+
];
|
|
64
|
+
};
|
|
65
|
+
const getStudentGGBOptions = (identifiers) => {
|
|
66
|
+
const points = getSolutionPoints(identifiers);
|
|
67
|
+
const { xMin, xMax, yMin, yMax } = boxXY(points.map((p) => [p.x.evaluate(), p.y.evaluate()]));
|
|
68
|
+
const ggb = new GeogebraConstructor({
|
|
69
|
+
commands: [],
|
|
70
|
+
customToolBar: toolBarConstructor({
|
|
71
|
+
point: true,
|
|
72
|
+
}),
|
|
73
|
+
lockedAxesRatio: false,
|
|
74
|
+
});
|
|
75
|
+
const coords = [
|
|
76
|
+
xMin - 0.5 * (xMax - xMin),
|
|
77
|
+
xMax + 0.5 * (xMax - xMin),
|
|
78
|
+
yMin - 0.5 * (yMax - yMin),
|
|
79
|
+
yMax + 0.5 * (yMax - yMin),
|
|
80
|
+
];
|
|
81
|
+
return ggb.getOptions({
|
|
82
|
+
coords,
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
const isGGBAnswerValid = (ans, { ggbAnswer, ...identifiers }) => {
|
|
86
|
+
const commands = ans;
|
|
87
|
+
const ggbParser = new GeogebraParser(commands);
|
|
88
|
+
const objectDict = ggbParser.objectDict();
|
|
89
|
+
const pointsCoords = Object.keys(objectDict).map((name) => ggbParser.pointCoords(name));
|
|
90
|
+
const pointsCoordsSortedByAscX = pointsCoords.toSorted(([x1], [x2]) => {
|
|
91
|
+
return x1 - x2;
|
|
92
|
+
});
|
|
93
|
+
const solutionPointsSortedByAscX = getSolutionPoints(identifiers).toSorted((p1, p2) => {
|
|
94
|
+
return p1.x.evaluate() - p2.x.evaluate();
|
|
95
|
+
});
|
|
96
|
+
return (pointsCoordsSortedByAscX.length === solutionPointsSortedByAscX.length &&
|
|
97
|
+
pointsCoordsSortedByAscX.every(([x, y], i) => {
|
|
98
|
+
const studentPoint = new Point("StudentPoint", x, y);
|
|
99
|
+
const solutionPoint = solutionPointsSortedByAscX[i];
|
|
100
|
+
const distance = studentPoint.distanceTo(solutionPoint);
|
|
101
|
+
return distance < 1;
|
|
102
|
+
}));
|
|
103
|
+
};
|
|
104
|
+
const getPlacePointsFromDataTableQuestion = () => {
|
|
105
|
+
function createArrCoordsAsNodes(rowBasedDataTable, indexX, indexY) {
|
|
106
|
+
const [nodesX, nodesY] = [indexX, indexY].map((i) => rowBasedDataTable[i]
|
|
107
|
+
.slice(1)
|
|
108
|
+
.map((strValue) => parseAlgebraic(strValue)));
|
|
109
|
+
const arrCoordsAsNodes = nodesX.map((nodeX, i) => {
|
|
110
|
+
const nodeY = nodesY[i];
|
|
111
|
+
return [nodeX, nodeY];
|
|
112
|
+
});
|
|
113
|
+
return arrCoordsAsNodes;
|
|
114
|
+
}
|
|
115
|
+
const isRowBased = coinFlip();
|
|
116
|
+
const nbCateg = 3;
|
|
117
|
+
const nbValues = 3;
|
|
118
|
+
let rowBasedDataTable = [];
|
|
119
|
+
let indexX = -1;
|
|
120
|
+
let indexY = -1;
|
|
121
|
+
let arrCoordsAsNodes = [];
|
|
122
|
+
let counter = -1;
|
|
123
|
+
let isValidTable = false;
|
|
124
|
+
while (!isValidTable && counter < 100) {
|
|
125
|
+
counter++;
|
|
126
|
+
rowBasedDataTable = randomDataTable(nbCateg, nbValues, true);
|
|
127
|
+
[indexX, indexY] = randomMany([...Array(rowBasedDataTable.length).keys()], 2);
|
|
128
|
+
arrCoordsAsNodes = createArrCoordsAsNodes(rowBasedDataTable, indexX, indexY);
|
|
129
|
+
const arrXY = arrCoordsAsNodes.map(([nodeX, nodeY]) => [nodeX, nodeY].map((node) => node.evaluate()));
|
|
130
|
+
isValidTable = isBoxable(arrXY);
|
|
131
|
+
}
|
|
132
|
+
if (!isValidTable) {
|
|
133
|
+
rowBasedDataTable = [
|
|
134
|
+
["âge", "10", "11", "12"],
|
|
135
|
+
["nombre de frères et soeurs", "1", "2", "3"],
|
|
136
|
+
];
|
|
137
|
+
[indexX, indexY] = [0, 1];
|
|
138
|
+
arrCoordsAsNodes = createArrCoordsAsNodes(rowBasedDataTable, indexX, indexY);
|
|
139
|
+
}
|
|
140
|
+
const identifiers = {
|
|
141
|
+
isRowBased,
|
|
142
|
+
rowBasedDataTable,
|
|
143
|
+
indexX,
|
|
144
|
+
indexY,
|
|
145
|
+
arrCoordsAsNodeIds: arrCoordsAsNodes.map(([nodeX, nodeY]) => [nodeX, nodeY].map((node) => node.toIdentifiers())),
|
|
146
|
+
};
|
|
147
|
+
return getQuestionFromIdentifiers(identifiers);
|
|
148
|
+
};
|
|
149
|
+
const getQuestionFromIdentifiers = (identifiers) => {
|
|
150
|
+
return {
|
|
151
|
+
ggbAnswer: getGGBAnswer(identifiers),
|
|
152
|
+
instruction: getInstruction(identifiers),
|
|
153
|
+
studentGgbOptions: getStudentGGBOptions(identifiers),
|
|
154
|
+
identifiers,
|
|
155
|
+
hint: getHint(identifiers),
|
|
156
|
+
correction: getCorrection(identifiers),
|
|
157
|
+
};
|
|
158
|
+
};
|
|
159
|
+
export const placePointsFromDataTable = {
|
|
160
|
+
id: "placePointsFromDataTable",
|
|
161
|
+
label: "Placer des points issus d'un tableau de données",
|
|
162
|
+
isSingleStep: true,
|
|
163
|
+
generator: (nb, opts) => getDistinctQuestions(() => getPlacePointsFromDataTableQuestion(opts), nb),
|
|
164
|
+
ggbTimer: 60,
|
|
165
|
+
isGGBAnswerValid,
|
|
166
|
+
subject: "Mathématiques",
|
|
167
|
+
getHint,
|
|
168
|
+
getInstruction,
|
|
169
|
+
getCorrection,
|
|
170
|
+
getGGBAnswer,
|
|
171
|
+
getStudentGGBOptions,
|
|
172
|
+
answerType: "GGB",
|
|
173
|
+
getQuestionFromIdentifiers,
|
|
174
|
+
hasHintAndCorrection: true,
|
|
175
|
+
};
|
|
@@ -22,4 +22,6 @@ export * from "./coordsOfPointOnAffineFindY.js";
|
|
|
22
22
|
export * from "./representationOfAffine.js";
|
|
23
23
|
export * from "./drawAffineFromPointAndLeadingCoeff.js";
|
|
24
24
|
export * from "./drawAffineFromProgCalc.js";
|
|
25
|
+
export * from "./placePointsFromAffine.js";
|
|
26
|
+
export * from "./recognizeAffinePointsFromPoints.js";
|
|
25
27
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/functions/affines/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,mBAAmB,CAAC;AAClC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,oCAAoC,CAAC;AACnD,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yCAAyC,CAAC;AACxD,cAAc,6BAA6B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/functions/affines/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,mBAAmB,CAAC;AAClC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,oCAAoC,CAAC;AACnD,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yCAAyC,CAAC;AACxD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sCAAsC,CAAC"}
|
|
@@ -22,3 +22,5 @@ export * from "./coordsOfPointOnAffineFindY.js";
|
|
|
22
22
|
export * from "./representationOfAffine.js";
|
|
23
23
|
export * from "./drawAffineFromPointAndLeadingCoeff.js";
|
|
24
24
|
export * from "./drawAffineFromProgCalc.js";
|
|
25
|
+
export * from "./placePointsFromAffine.js";
|
|
26
|
+
export * from "./recognizeAffinePointsFromPoints.js";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Exercise } from "../../../../exercises/exercise.js";
|
|
2
|
+
import { NodeIdentifiers } from "../../../../tree/nodes/nodeConstructor.js";
|
|
3
|
+
type Identifiers = {
|
|
4
|
+
nodeIds: NodeIdentifiers;
|
|
5
|
+
};
|
|
6
|
+
export declare const placePointsFromAffine: Exercise<Identifiers>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=placePointsFromAffine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"placePointsFromAffine.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/functions/affines/placePointsFromAffine.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAST,MAAM,6BAA6B,CAAC;AAWrC,OAAO,EAEL,eAAe,EAChB,MAAM,qCAAqC,CAAC;AAI7C,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,eAAe,CAAC;CAC1B,CAAC;AAkKF,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,WAAW,CAkBvD,CAAC"}
|