math-exercises 3.0.132 → 3.0.134

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.
Files changed (87) hide show
  1. package/lib/exercises/math/calcul/mentalCaluls/mentalProgramSolve.d.ts +1 -1
  2. package/lib/exercises/math/calcul/mentalCaluls/mentalProgramSolve.d.ts.map +1 -1
  3. package/lib/exercises/math/calcul/mentalCaluls/mentalProgramSolve.js +5 -5
  4. package/lib/exercises/math/calcul/ordering/compareA10N.d.ts.map +1 -1
  5. package/lib/exercises/math/calcul/ordering/compareA10N.js +12 -7
  6. package/lib/exercises/math/calcul/rounding/estimatePow10NPlusPow10MinusN.d.ts.map +1 -1
  7. package/lib/exercises/math/calcul/rounding/estimatePow10NPlusPow10MinusN.js +8 -6
  8. package/lib/exercises/math/calculLitteral/distributivity/doubleDistri.d.ts.map +1 -1
  9. package/lib/exercises/math/calculLitteral/distributivity/doubleDistri.js +4 -0
  10. package/lib/exercises/math/calculLitteral/equation/equationFromProblem.d.ts.map +1 -1
  11. package/lib/exercises/math/calculLitteral/equation/equationFromProblem.js +8 -9
  12. package/lib/exercises/math/calculLitteral/simplifying/compareATimes0.d.ts.map +1 -1
  13. package/lib/exercises/math/calculLitteral/simplifying/compareATimes0.js +4 -4
  14. package/lib/exercises/math/conversion/prefixToNumber.d.ts +0 -2
  15. package/lib/exercises/math/conversion/prefixToNumber.d.ts.map +1 -1
  16. package/lib/exercises/math/conversion/prefixToNumber.js +27 -22
  17. package/lib/exercises/math/functions/affines/drawAffineFromPointAndLeadingCoeff.d.ts.map +1 -1
  18. package/lib/exercises/math/functions/affines/drawAffineFromPointAndLeadingCoeff.js +1 -2
  19. package/lib/exercises/math/functions/trinoms/roots/rootsReading.d.ts +4 -1
  20. package/lib/exercises/math/functions/trinoms/roots/rootsReading.d.ts.map +1 -1
  21. package/lib/exercises/math/functions/trinoms/roots/rootsReading.js +29 -9
  22. package/lib/exercises/math/geometry/cartesian/index.d.ts +1 -0
  23. package/lib/exercises/math/geometry/cartesian/index.d.ts.map +1 -1
  24. package/lib/exercises/math/geometry/cartesian/index.js +1 -0
  25. package/lib/exercises/math/geometry/cartesian/midpoint.d.ts.map +1 -1
  26. package/lib/exercises/math/geometry/cartesian/midpoint.js +8 -1
  27. package/lib/exercises/math/geometry/cartesian/placeAbscissOnSemiLine.d.ts +6 -9
  28. package/lib/exercises/math/geometry/cartesian/placeAbscissOnSemiLine.d.ts.map +1 -1
  29. package/lib/exercises/math/geometry/cartesian/placeAbscissOnSemiLine.js +60 -137
  30. package/lib/exercises/math/geometry/cartesian/placeAbscissOnSemiLineV2.d.ts +16 -0
  31. package/lib/exercises/math/geometry/cartesian/placeAbscissOnSemiLineV2.d.ts.map +1 -0
  32. package/lib/exercises/math/geometry/cartesian/placeAbscissOnSemiLineV2.js +213 -0
  33. package/lib/exercises/math/probaStat/basicProbas/possibleValuesForProba.js +2 -2
  34. package/lib/exercises/math/probaStat/conditionalProbaWriteFromFrench.js +6 -6
  35. package/lib/exercises/math/probaStat/probaAsSumOfProbas.d.ts +0 -1
  36. package/lib/exercises/math/probaStat/probaAsSumOfProbas.d.ts.map +1 -1
  37. package/lib/exercises/math/probaStat/probaAsSumOfProbas.js +52 -59
  38. package/lib/exercises/math/probaStat/stats1var/plausibilityOfAverage.d.ts.map +1 -1
  39. package/lib/exercises/math/probaStat/stats1var/plausibilityOfAverage.js +70 -23
  40. package/lib/exercises/math/sequences/arithmetic/arithmeticFindExplicitFormulaFirstRankOne.d.ts +8 -0
  41. package/lib/exercises/math/sequences/arithmetic/arithmeticFindExplicitFormulaFirstRankOne.d.ts.map +1 -0
  42. package/lib/exercises/math/sequences/arithmetic/arithmeticFindExplicitFormulaFirstRankOne.js +105 -0
  43. package/lib/exercises/math/sequences/arithmetic/arithmeticFindTermFirstRankOne.d.ts +9 -0
  44. package/lib/exercises/math/sequences/arithmetic/arithmeticFindTermFirstRankOne.d.ts.map +1 -0
  45. package/lib/exercises/math/sequences/arithmetic/arithmeticFindTermFirstRankOne.js +99 -0
  46. package/lib/exercises/math/sequences/arithmetic/arithmeticRecurrenceFormulaUsage.d.ts.map +1 -1
  47. package/lib/exercises/math/sequences/arithmetic/arithmeticRecurrenceFormulaUsage.js +9 -1
  48. package/lib/exercises/math/sequences/arithmetic/index.d.ts +2 -0
  49. package/lib/exercises/math/sequences/arithmetic/index.d.ts.map +1 -1
  50. package/lib/exercises/math/sequences/arithmetic/index.js +2 -0
  51. package/lib/exercises/math/sequences/genericSequenceVariations.d.ts.map +1 -1
  52. package/lib/exercises/math/sequences/genericSequenceVariations.js +5 -1
  53. package/lib/exercises/math/sequences/geometric/geometricExplicitFormulaUsage.d.ts.map +1 -1
  54. package/lib/exercises/math/sequences/geometric/geometricExplicitFormulaUsage.js +7 -1
  55. package/lib/exercises/math/sequences/geometric/geometricFindExplicitFormula.d.ts.map +1 -1
  56. package/lib/exercises/math/sequences/geometric/geometricFindExplicitFormula.js +1 -1
  57. package/lib/exercises/math/sequences/geometric/geometricFindExplicitFormulaFirstRankOne.d.ts +8 -0
  58. package/lib/exercises/math/sequences/geometric/geometricFindExplicitFormulaFirstRankOne.d.ts.map +1 -0
  59. package/lib/exercises/math/sequences/geometric/geometricFindExplicitFormulaFirstRankOne.js +112 -0
  60. package/lib/exercises/math/sequences/geometric/geometricFindTermFirstRankOne.d.ts +9 -0
  61. package/lib/exercises/math/sequences/geometric/geometricFindTermFirstRankOne.d.ts.map +1 -0
  62. package/lib/exercises/math/sequences/geometric/geometricFindTermFirstRankOne.js +97 -0
  63. package/lib/exercises/math/sequences/geometric/geometricReasonUsage.d.ts.map +1 -1
  64. package/lib/exercises/math/sequences/geometric/geometricReasonUsage.js +3 -1
  65. package/lib/exercises/math/sequences/geometric/geometricRecurrenceFormulaUsage.d.ts.map +1 -1
  66. package/lib/exercises/math/sequences/geometric/geometricRecurrenceFormulaUsage.js +9 -1
  67. package/lib/exercises/math/sequences/geometric/index.d.ts +2 -0
  68. package/lib/exercises/math/sequences/geometric/index.d.ts.map +1 -1
  69. package/lib/exercises/math/sequences/geometric/index.js +2 -0
  70. package/lib/exercises/math/sequences/recurrenceFormulaUsage.d.ts.map +1 -1
  71. package/lib/exercises/math/sequences/recurrenceFormulaUsage.js +10 -3
  72. package/lib/exercises/pc/index.d.ts +0 -1
  73. package/lib/exercises/pc/index.d.ts.map +1 -1
  74. package/lib/exercises/pc/index.js +0 -1
  75. package/lib/exercises/pc/motion/averageSpeed.d.ts +0 -2
  76. package/lib/exercises/pc/motion/averageSpeed.d.ts.map +1 -1
  77. package/lib/exercises/pc/motion/averageSpeed.js +28 -36
  78. package/lib/exercises/pc/weight/calculateWeight.d.ts +0 -1
  79. package/lib/exercises/pc/weight/calculateWeight.d.ts.map +1 -1
  80. package/lib/exercises/pc/weight/calculateWeight.js +26 -19
  81. package/lib/index.d.ts +26 -39
  82. package/lib/index.d.ts.map +1 -1
  83. package/lib/playgroundUtils.d.ts +3 -0
  84. package/lib/playgroundUtils.d.ts.map +1 -0
  85. package/lib/playgroundUtils.js +13 -0
  86. package/lib/server.js +126 -0
  87. package/package.json +1 -1
@@ -216,8 +216,7 @@ class FiniteProbDistr {
216
216
  const dictPToArrayOfIndexes = {};
217
217
  for (let i = 0; i < arrProba.length; i++) {
218
218
  const p = arrProba[i];
219
- console.log("will simplify", p);
220
- const tex = p.simplify().toTex();
219
+ const tex = p.toTex();
221
220
  if (dictPToArrayOfIndexes[tex] === undefined) {
222
221
  dictPToArrayOfIndexes[tex] = [];
223
222
  }
@@ -233,7 +232,7 @@ class FiniteProbDistr {
233
232
  return p;
234
233
  }
235
234
  getArrIndexForP(p) {
236
- return this.dictPToArrayOfIndexes[p.simplify().toTex()];
235
+ return this.dictPToArrayOfIndexes[p.toTex()];
237
236
  }
238
237
  getArrFrenchStrings(isDisplayingValue) {
239
238
  return Object.entries(this.dictPToArrayOfIndexes)
@@ -273,12 +272,15 @@ const getAnswerValueNode = (identifiers) => {
273
272
  const { eventIds, arrProba } = identifiers;
274
273
  const evUnion = EventConstructor.fromIdentifiers(eventIds);
275
274
  const finiteProbDistr = FiniteProbDistrConstructor.fromArrProba(arrProba.map((nodeIds) => NodeConstructor.fromIdentifiers(nodeIds)));
276
- const nodeSumSimplified = operatorComposition(AddNode, evUnion
275
+ const arrFrac = evUnion
277
276
  .getArrElem()
278
- .map((evElem) => finiteProbDistr.getPForIndex(evElem.index))).simplify({
279
- //!TODO Sebastien : ne doit pas être nécessaire, à fix
280
- //nbMaxSteps: 100,
281
- });
277
+ .map((evElem) => finiteProbDistr.getPForIndex(evElem.index));
278
+ const nodeSumSimplified = (() => {
279
+ const den = arrFrac[0].rightChild.evaluate();
280
+ return frac(arrFrac
281
+ .map((fNode) => fNode.leftChild.evaluate())
282
+ .reduce((acc, x) => acc + x, 0), den);
283
+ })();
282
284
  return nodeSumSimplified;
283
285
  };
284
286
  const getAnswerNode = (identifiers) => {
@@ -320,11 +322,7 @@ $$
320
322
  p_{${evElem.id}} = ${finiteProbDistr.getPForIndex(evElem.index).toTex()}
321
323
  $$`).join(`
322
324
  `)}`;
323
- const nodeSumSimplified = operatorComposition(AddNode, evUnion
324
- .getArrElem()
325
- .map((evElem) => finiteProbDistr.getPForIndex(evElem.index))).simplify({
326
- //nbMaxSteps: 100,
327
- });
325
+ const nodeSumSimplified = getAnswerNode(identifiers);
328
326
  strCorrection += `
329
327
  Donc:
330
328
 
@@ -344,7 +342,6 @@ $$`;
344
342
  const optsDefault = {
345
343
  nbElem: ["4", "6", "10", "12"],
346
344
  unionLength: ["2", "3", "4", "5"],
347
- isProbasAreNumbers: true,
348
345
  };
349
346
  const options = [
350
347
  {
@@ -363,13 +360,6 @@ const options = [
363
360
  values: ["2", "3", "4", "5", "6"],
364
361
  defaultValue: optsDefault.unionLength,
365
362
  },
366
- // {
367
- // id: "isProbasAreNumbers",
368
- // label: "Probabilités sous forme de nombres ?",
369
- // type: GeneratorOptionType.checkbox,
370
- // target: GeneratorOptionTarget.generation,
371
- // defaultValue: optsDefault.isProbasAreNumbers,
372
- // },
373
363
  ];
374
364
  const getKeys = () => {
375
365
  return [];
@@ -382,39 +372,41 @@ const getPropositions = (n, { answer, ...identifiers }) => {
382
372
  addValidProp(propositions, answer);
383
373
  if (isProbasAreNumbers) {
384
374
  const finiteProbDistr = FiniteProbDistrConstructor.fromArrProba(arrProba.map((nodeIds) => NodeConstructor.fromIdentifiers(nodeIds)));
385
- tryToAddWrongProp(propositions, operatorComposition(MultiplyNode, evUnion
386
- .getArrElem()
387
- .map((evElem) => finiteProbDistr.getPForIndex(evElem.index)))
388
- .simplify({
389
- //nbMaxSteps: 100,
390
- })
391
- .toTex());
392
- tryToAddWrongProp(propositions, substract(1, operatorComposition(MultiplyNode, evUnion
393
- .getArrElem()
394
- .map((evElem) => finiteProbDistr.getPForIndex(evElem.index))))
395
- .simplify({
396
- //nbMaxSteps: 100,
397
- })
398
- .toTex());
399
- tryToAddWrongProp(propositions, substract(1, operatorComposition(AddNode, evUnion
400
- .getArrElem()
401
- .map((evElem) => finiteProbDistr.getPForIndex(evElem.index))).simplify({
402
- //nbMaxSteps: 100,
403
- })).toTex());
404
- tryToAddWrongProp(propositions, operatorComposition(AddNode, evUnion
375
+ const arrFrac = evUnion
405
376
  .getArrElem()
406
- .map((evElem) => multiply(evElem.index, finiteProbDistr.getPForIndex(evElem.index))))
407
- .simplify({
408
- //nbMaxSteps: 100,
409
- })
410
- .toTex());
411
- tryToAddWrongProp(propositions, multiply(frac(1, evUnion.getArrElem().length), operatorComposition(AddNode, evUnion
412
- .getArrElem()
413
- .map((evElem) => finiteProbDistr.getPForIndex(evElem.index))))
414
- .simplify({
415
- //nbMaxSteps: 100,
416
- })
417
- .toTex());
377
+ .map((evElem) => finiteProbDistr.getPForIndex(evElem.index));
378
+ tryToAddWrongProp(propositions, (() => {
379
+ const den = arrFrac[0].rightChild.evaluate();
380
+ return frac(arrFrac
381
+ .map((fNode) => fNode.leftChild.evaluate())
382
+ .reduce((acc, x) => acc * x, 0), den);
383
+ })().toTex());
384
+ tryToAddWrongProp(propositions, (() => {
385
+ const den = arrFrac[0].rightChild.evaluate();
386
+ return frac(den -
387
+ arrFrac
388
+ .map((fNode) => fNode.leftChild.evaluate())
389
+ .reduce((acc, x) => acc * x, 0), den);
390
+ })().toTex());
391
+ tryToAddWrongProp(propositions, (() => {
392
+ const den = arrFrac[0].rightChild.evaluate();
393
+ return frac(den -
394
+ arrFrac
395
+ .map((fNode) => fNode.leftChild.evaluate())
396
+ .reduce((acc, x) => acc + x, 0), den);
397
+ })().toTex());
398
+ tryToAddWrongProp(propositions, (() => {
399
+ const den = arrFrac[0].rightChild.evaluate();
400
+ return frac(arrFrac
401
+ .map((fNode, i) => fNode.leftChild.evaluate() * i)
402
+ .reduce((acc, x) => acc + x, 0), den);
403
+ })().toTex());
404
+ tryToAddWrongProp(propositions, (() => {
405
+ const den = arrFrac[0].rightChild.evaluate();
406
+ return frac(arrFrac
407
+ .map((fNode) => fNode.leftChild.evaluate())
408
+ .reduce((acc, x) => acc + x, 0), den * evUnion.getArrElem().length);
409
+ })().toTex());
418
410
  }
419
411
  else {
420
412
  tryToAddWrongProp(propositions, operatorComposition(MultiplyNode, evUnion.getArrElem().map((evElem) => evElem.p))
@@ -451,10 +443,13 @@ const getValueNode = (tex, arrProba) => {
451
443
  return parseInt(texVar.substring(texVar.indexOf("E_{") + 3, texVar.indexOf("}}")));
452
444
  }
453
445
  });
454
- const arrayOfNodes = arrayOfIndexes.map((i) => finiteProbDistr.getPForIndex(i));
455
- return operatorComposition(AddNode, arrayOfNodes).simplify({
456
- //nbMaxSteps: 100,
457
- });
446
+ const arrFrac = arrayOfIndexes.map((i) => finiteProbDistr.getPForIndex(i));
447
+ return (() => {
448
+ const den = arrFrac[0].rightChild.evaluate();
449
+ return frac(arrFrac
450
+ .map((fNode) => fNode.leftChild.evaluate())
451
+ .reduce((acc, x) => acc + x, 0), den);
452
+ })();
458
453
  };
459
454
  const isAnswerValid = (ans, { answer, ...identifiers }) => {
460
455
  const { arrProba } = identifiers;
@@ -481,12 +476,10 @@ const getProbaAsSumOfProbasQuestion = (optsIn) => {
481
476
  const eventIds = evUnion.toIdentifiers();
482
477
  const nbUnique = Math.min(randint(3, 7), situation.allElem.length - 1);
483
478
  const finiteProbDistr = FiniteProbDistrConstructor.randomDistr(situation.allElem.length, nbUnique);
484
- const isProbasAreNumbers = opts.isProbasAreNumbers;
485
479
  const identifiers = {
486
480
  indexSituation,
487
481
  eventIds,
488
482
  arrProba: finiteProbDistr.arrProba.map((node) => node.toIdentifiers()),
489
- isProbasAreNumbers,
490
483
  };
491
484
  return getQuestionFromIdentifiers(identifiers, opts);
492
485
  };
@@ -1 +1 @@
1
- {"version":3,"file":"plausibilityOfAverage.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/probaStat/stats1var/plausibilityOfAverage.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAYT,MAAM,6BAA6B,CAAC;AAOrC,KAAK,WAAW,GAAG;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAoKF,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,WAAW,CAkBvD,CAAC"}
1
+ {"version":3,"file":"plausibilityOfAverage.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/probaStat/stats1var/plausibilityOfAverage.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAYT,MAAM,6BAA6B,CAAC;AAMrC,KAAK,WAAW,GAAG;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAiOF,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,WAAW,CAkBvD,CAAC"}
@@ -3,7 +3,6 @@ import { getDistinctQuestions } from "../../../../exercises/utils/getDistinctQue
3
3
  import { randint } from "../../../../math/utils/random/randint.js";
4
4
  import { coinFlip } from "../../../../utils/alea/coinFlip.js";
5
5
  import { random } from "../../../../utils/alea/random.js";
6
- import { mdTable } from "../../../../utils/markdown/mdTable.js";
7
6
  const getInstruction = (identifiers) => {
8
7
  const { a, values, isQuestionIsAboveA } = identifiers;
9
8
  return `Si on considère la série suivante :
@@ -20,36 +19,84 @@ La proposition suivante est-elle vraie ?
20
19
  const getHint = ({ a }) => {
21
20
  return `Regarde l'écart des valeurs par rapport à $${a.frenchify()}$.`;
22
21
  };
22
+ // const getCorrection: GetCorrection<Identifiers> = (identifiers) => {
23
+ // const { a, values, isAboveA } = identifiers;
24
+ // const answer = getAnswer(identifiers);
25
+ // const valuesBelowA = values.filter((v) => v < a);
26
+ // const valuesAboveA = values.filter((v) => v > a);
27
+ // return `${answer}, car si l'on regarde les écarts par rapport à $${a.frenchify()}$ :
28
+ // $\\ $
29
+ // ${mdTable(
30
+ // [
31
+ // ["\\text{Valeur}", "\\text{Écart}"],
32
+ // [`\\text{Valeurs inférieures à } ${a.frenchify()}`, "\\text{}"],
33
+ // ...valuesBelowA.map((v) => [v.frenchify(), (v - a).frenchify()]),
34
+ // [
35
+ // "\\text{Total inférieur}",
36
+ // valuesBelowA
37
+ // .map((v) => v - a)
38
+ // .reduce((acc, v) => acc + v, 0)
39
+ // .frenchify(),
40
+ // ],
41
+ // [`\\text{Valeurs supérieures à } ${a.frenchify()}`, "\\text{}"],
42
+ // ...valuesAboveA.map((v) => [v.frenchify(), `+${(v - a).frenchify()}`]),
43
+ // [
44
+ // "\\text{Total supérieur}",
45
+ // `+${valuesAboveA
46
+ // .map((v) => v - a)
47
+ // .reduce((acc, v) => acc + v, 0)
48
+ // .frenchify()}`,
49
+ // ],
50
+ // ],
51
+ // true,
52
+ // )}
53
+ // $\\ $
54
+ // Le total ${
55
+ // isAboveA ? `supérieur` : `inférieur`
56
+ // } est plus grand, en valeur absolue, que le total ${
57
+ // isAboveA ? `inférieur` : `supérieur`
58
+ // } donc on peut affirmer que la moyenne de cette série est strictement ${
59
+ // isAboveA ? `supérieure` : `inférieure`
60
+ // } à $${a.frenchify()}$.`;
61
+ // };
23
62
  const getCorrection = (identifiers) => {
24
63
  const { a, values, isAboveA } = identifiers;
25
64
  const answer = getAnswer(identifiers);
26
65
  const valuesBelowA = values.filter((v) => v < a);
27
66
  const valuesAboveA = values.filter((v) => v > a);
28
- return `${answer}, car si l'on regarde les écarts par rapport à $${a.frenchify()}$ :
67
+ return `${answer}. En effet :
29
68
 
30
69
  $\\ $
70
+
71
+ Si l'on regarde les valeurs strictement inférieures à $${a.frenchify()}$ :
72
+
73
+ ${valuesBelowA
74
+ .map((v) => `
75
+
76
+ $${v.frenchify()}$ est $${(a - v).frenchify()}$ points en dessous de $${a.frenchify()}$
31
77
 
32
- ${mdTable([
33
- ["\\text{Valeur}", "\\text{Écart}"],
34
- [`\\text{Valeurs inférieures à } ${a.frenchify()}`, "\\text{}"],
35
- ...valuesBelowA.map((v) => [v.frenchify(), (v - a).frenchify()]),
36
- [
37
- "\\text{Total inférieur}",
38
- valuesBelowA
39
- .map((v) => v - a)
40
- .reduce((acc, v) => acc + v, 0)
41
- .frenchify(),
42
- ],
43
- [`\\text{Valeurs supérieures à } ${a.frenchify()}`, "\\text{}"],
44
- ...valuesAboveA.map((v) => [v.frenchify(), `+${(v - a).frenchify()}`]),
45
- [
46
- "\\text{Total supérieur}",
47
- `+${valuesAboveA
48
- .map((v) => v - a)
49
- .reduce((acc, v) => acc + v, 0)
50
- .frenchify()}`,
51
- ],
52
- ], true)}
78
+ `)
79
+ .join("")}
80
+ Ce qui fait en tout $${valuesBelowA
81
+ .map((v) => a - v)
82
+ .reduce((acc, v) => acc + v, 0)
83
+ .frenchify()}$ points en dessous de $${a.frenchify()}$.
84
+
85
+ $\\ $
86
+
87
+ Si l'on regarde les valeurs strictement supérieures à $${a.frenchify()}$ :
88
+
89
+ ${valuesAboveA
90
+ .map((v) => `
91
+
92
+ $${v.frenchify()}$ est $${(v - a).frenchify()}$ points en dessus de $${a.frenchify()}$
93
+
94
+ `)
95
+ .join("")}
96
+ Ce qui fait en tout $${valuesAboveA
97
+ .map((v) => v - a)
98
+ .reduce((acc, v) => acc + v, 0)
99
+ .frenchify()}$ points au dessus de $${a.frenchify()}$.
53
100
 
54
101
  $\\ $
55
102
 
@@ -0,0 +1,8 @@
1
+ import { Exercise } from "../../../../exercises/exercise.js";
2
+ type Identifiers = {
3
+ firstValue: number;
4
+ reason: number;
5
+ };
6
+ export declare const arithmeticFindExplicitFormulaFirstRankOne: Exercise<Identifiers>;
7
+ export {};
8
+ //# sourceMappingURL=arithmeticFindExplicitFormulaFirstRankOne.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arithmeticFindExplicitFormulaFirstRankOne.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/sequences/arithmetic/arithmeticFindExplicitFormulaFirstRankOne.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAcT,MAAM,6BAA6B,CAAC;AAQrC,KAAK,WAAW,GAAG;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AA4GF,eAAO,MAAM,yCAAyC,EAAE,QAAQ,CAAC,WAAW,CAgBzE,CAAC"}
@@ -0,0 +1,105 @@
1
+ import { addValidProp, propWhile, tryToAddWrongProp, } from "../../../../exercises/exercise.js";
2
+ import { getDistinctQuestions } from "../../../../exercises/utils/getDistinctQuestions.js";
3
+ import { Polynomial } from "../../../../math/polynomials/polynomial.js";
4
+ import { randint } from "../../../../math/utils/random/randint.js";
5
+ import { parseAlgebraic } from "../../../../tree/parsers/latexParser.js";
6
+ import { shuffle } from "../../../../utils/alea/shuffle.js";
7
+ import { handleVEAError } from "../../../../utils/errors/handleVEAError.js";
8
+ const getInstruction = (identifiers) => {
9
+ return `$(u_n)$ est une suite arithmétique de premier terme $u_{1} = ${identifiers.firstValue}$ et de raison $r = ${identifiers.reason}$.
10
+
11
+ Donner l'expression de $u_n$ en fonction de $n$.`;
12
+ };
13
+ const getHint = (_identifiers) => {
14
+ return `Utilise la formule générale d'une suite arithmétique :
15
+
16
+ $$
17
+ u_n = u_1 + (n-1) \\times r
18
+ $$
19
+
20
+ où $u_1$ est le premier terme et $r$ la raison.`;
21
+ };
22
+ const getCorrection = (identifiers) => {
23
+ const answer = getAnswer(identifiers);
24
+ return `La formule générale d'une suite arithmétique est :
25
+
26
+ $$
27
+ u_n = u_1 + (n-1) \\times r
28
+ $$
29
+
30
+ où $u_1$ est le premier terme et $r$ la raison.
31
+
32
+ Ici, puisque $u_1 = ${identifiers.firstValue}$ et $r = ${identifiers.reason}$, on a :
33
+
34
+ $$
35
+ ${answer}
36
+ $$
37
+
38
+ `;
39
+ };
40
+ const getAnswer = (identifiers) => {
41
+ const { firstValue, reason } = identifiers;
42
+ const formula = new Polynomial([firstValue - reason, reason], "n");
43
+ const answer = "u_n=" + formula.toTex();
44
+ return answer;
45
+ };
46
+ const getArithmeticFindExplicitFormula = () => {
47
+ const firstValue = randint(-10, 10);
48
+ const reason = randint(-10, 10, [0]);
49
+ const identifiers = { firstValue, reason };
50
+ return getQuestionFromIdentifiers(identifiers);
51
+ };
52
+ const getQuestionFromIdentifiers = (identifiers) => {
53
+ const question = {
54
+ instruction: getInstruction(identifiers),
55
+ answer: getAnswer(identifiers),
56
+ keys: ["un", "equal", "n"],
57
+ answerFormat: "tex",
58
+ identifiers,
59
+ hint: getHint(identifiers),
60
+ correction: getCorrection(identifiers),
61
+ };
62
+ return question;
63
+ };
64
+ const getPropositions = (n, { answer, firstValue, reason }) => {
65
+ const propositions = [];
66
+ addValidProp(propositions, answer);
67
+ propWhile(propositions, n, () => {
68
+ tryToAddWrongProp(propositions, "u_n=" +
69
+ new Polynomial([firstValue + randint(-3, 4), reason + randint(-3, 4, [-reason])], "n")
70
+ .toTree()
71
+ .toTex());
72
+ });
73
+ return shuffle(propositions);
74
+ };
75
+ const isAnswerValid = (ans, { answer }) => {
76
+ try {
77
+ const formated = ans.replaceAll("u_n", "").replaceAll("=", "");
78
+ const parsed = parseAlgebraic(formated);
79
+ if (!parsed)
80
+ return false;
81
+ return (parsed
82
+ .simplify({
83
+ towardsDistribute: true,
84
+ forbidFactorize: true,
85
+ })
86
+ .toTex() === answer.split("=")[1]);
87
+ }
88
+ catch (err) {
89
+ return handleVEAError(err);
90
+ }
91
+ };
92
+ export const arithmeticFindExplicitFormulaFirstRankOne = {
93
+ id: "arithmeticFindExplicitFormulaFirstRankOne",
94
+ connector: "=",
95
+ label: "Déterminer la formule générale d'une suite arithmétique (premier terme $u_1$)",
96
+ isSingleStep: false,
97
+ generator: (nb, opts) => getDistinctQuestions(() => getArithmeticFindExplicitFormula(opts), nb),
98
+ qcmTimer: 60,
99
+ freeTimer: 60,
100
+ getPropositions,
101
+ isAnswerValid,
102
+ subject: "Mathématiques",
103
+ hasHintAndCorrection: true,
104
+ getQuestionFromIdentifiers,
105
+ };
@@ -0,0 +1,9 @@
1
+ import { Exercise } from "../../../../exercises/exercise.js";
2
+ type Identifiers = {
3
+ firstTerm: number;
4
+ reason: number;
5
+ askedRank: number;
6
+ };
7
+ export declare const arithmeticFindTermFirstRankOne: Exercise<Identifiers>;
8
+ export {};
9
+ //# sourceMappingURL=arithmeticFindTermFirstRankOne.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arithmeticFindTermFirstRankOne.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/sequences/arithmetic/arithmeticFindTermFirstRankOne.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAeT,MAAM,6BAA6B,CAAC;AASrC,KAAK,WAAW,GAAG;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAsGF,eAAO,MAAM,8BAA8B,EAAE,QAAQ,CAAC,WAAW,CAehE,CAAC"}
@@ -0,0 +1,99 @@
1
+ import { addValidProp, shuffleProps, tryToAddWrongProp, propWhile, } from "../../../../exercises/exercise.js";
2
+ import { getDistinctQuestions } from "../../../../exercises/utils/getDistinctQuestions.js";
3
+ import { randint } from "../../../../math/utils/random/randint.js";
4
+ import { AddNode } from "../../../../tree/nodes/operators/addNode.js";
5
+ import { MultiplyNode } from "../../../../tree/nodes/operators/multiplyNode.js";
6
+ import { SubstractNode } from "../../../../tree/nodes/operators/substractNode.js";
7
+ import { VariableNode } from "../../../../tree/nodes/variables/variableNode.js";
8
+ import { alignTex } from "../../../../utils/latex/alignTex.js";
9
+ const getInstruction = (identifiers) => {
10
+ const { firstTerm, reason, askedRank } = identifiers;
11
+ return `Soit $u$ la suite arithmétique de premier terme $u_1 = ${firstTerm}$ et de raison $r = ${reason}$.
12
+
13
+ Calculer $u_{${askedRank}}$.`;
14
+ };
15
+ const getAnswer = (identifiers) => {
16
+ const { firstTerm, reason, askedRank } = identifiers;
17
+ const answer = firstTerm + reason * (askedRank - 1);
18
+ return answer.frenchify();
19
+ };
20
+ const getHint = () => {
21
+ return `Le terme général d'une suite arithmétique est :
22
+
23
+ $$
24
+ u_n = u_1 + r \\times (n-1)
25
+ $$
26
+
27
+ où $u_1$ est le premier terme et $r$ la raison.`;
28
+ };
29
+ const getCorrection = (identifiers) => {
30
+ const { firstTerm, reason, askedRank } = identifiers;
31
+ return `Le terme général de la suite $u$ est :
32
+
33
+ ${alignTex([
34
+ [`u_n`, "=", `u_1 + r \\times (n-1)`],
35
+ [
36
+ "",
37
+ "=",
38
+ new AddNode(firstTerm.toTree(), new MultiplyNode(reason.toTree(), new SubstractNode(new VariableNode("n"), (1).toTree()))).toTex(),
39
+ ],
40
+ ])}
41
+
42
+ Il suffit alors de remplacer $n$ par $${askedRank}$ dans la formule :
43
+
44
+ ${alignTex([
45
+ [
46
+ `u_{${askedRank}}`,
47
+ "=",
48
+ `${new AddNode(firstTerm.toTree(), new MultiplyNode(reason.toTree(), (askedRank - 1).toTree())).toTex()}`,
49
+ ],
50
+ ["", "=", `${getAnswer(identifiers)}`],
51
+ ])}
52
+ `;
53
+ };
54
+ const getQuestionFromIdentifiers = (identifiers) => {
55
+ const question = {
56
+ answer: getAnswer(identifiers),
57
+ instruction: getInstruction(identifiers),
58
+ keys: [],
59
+ answerFormat: "tex",
60
+ identifiers,
61
+ hint: getHint(identifiers),
62
+ correction: getCorrection(identifiers),
63
+ };
64
+ return question;
65
+ };
66
+ const getArithmeticFindTermQuestion = () => {
67
+ const firstRank = 1;
68
+ const firstTerm = randint(-15, 15);
69
+ const reason = randint(-10, 10, [0]);
70
+ const askedRank = randint(5, 15);
71
+ const identifiers = { firstRank, askedRank, firstTerm, reason };
72
+ return getQuestionFromIdentifiers(identifiers);
73
+ };
74
+ const getPropositions = (n, { answer, askedRank, firstTerm, reason }) => {
75
+ const propositions = [];
76
+ addValidProp(propositions, answer);
77
+ propWhile(propositions, n, () => {
78
+ const fake = firstTerm + reason * (askedRank - randint(-4, 4, [1]));
79
+ tryToAddWrongProp(propositions, fake + "");
80
+ });
81
+ return shuffleProps(propositions, n);
82
+ };
83
+ const isAnswerValid = (ans, { answer }) => {
84
+ return ans === answer;
85
+ };
86
+ export const arithmeticFindTermFirstRankOne = {
87
+ id: "arithmeticFindTermFirstRankOne",
88
+ connector: "=",
89
+ label: "Calculer un terme d'une suite arithmétique à partir de son premier terme ($u_1$) et sa raison",
90
+ isSingleStep: true,
91
+ generator: (nb) => getDistinctQuestions(getArithmeticFindTermQuestion, nb),
92
+ qcmTimer: 60,
93
+ freeTimer: 60,
94
+ getPropositions,
95
+ isAnswerValid,
96
+ subject: "Mathématiques",
97
+ hasHintAndCorrection: true,
98
+ getQuestionFromIdentifiers,
99
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"arithmeticRecurrenceFormulaUsage.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/sequences/arithmetic/arithmeticRecurrenceFormulaUsage.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAaT,MAAM,6BAA6B,CAAC;AAIrC,KAAK,WAAW,GAAG;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAgEF,eAAO,MAAM,gCAAgC,EAAE,QAAQ,CAAC,WAAW,CAalE,CAAC"}
1
+ {"version":3,"file":"arithmeticRecurrenceFormulaUsage.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/sequences/arithmetic/arithmeticRecurrenceFormulaUsage.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAaT,MAAM,6BAA6B,CAAC;AAIrC,KAAK,WAAW,GAAG;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAwEF,eAAO,MAAM,gCAAgC,EAAE,QAAQ,CAAC,WAAW,CAalE,CAAC"}
@@ -5,7 +5,15 @@ import { shuffle } from "../../../../utils/alea/shuffle.js";
5
5
  const getInstruction = (identifiers) => {
6
6
  const { firstRank, firstValue, reason } = identifiers;
7
7
  const askedRank = firstRank + 1;
8
- return `$(u_n)$ est une suite définie par $u_{n+1} = ${reason} + u_n$ et $u_{${firstRank}} = ${firstValue}$. Calculer : $u_{${askedRank}}$`;
8
+ return `$(u_n)$ est une suite définie par :
9
+
10
+ $$
11
+ u_{n+1} = ${reason} + u_n
12
+ $$
13
+
14
+ et $u_{${firstRank}} = ${firstValue}$.
15
+
16
+ Calculer le terme $u_{${askedRank}}$.`;
9
17
  };
10
18
  const getAnswer = (identifiers) => {
11
19
  const { firstValue, reason } = identifiers;
@@ -1,5 +1,6 @@
1
1
  export * from "./arithmeticExplicitFormulaUsage.js";
2
2
  export * from "./arithmeticFindExplicitFormula.js";
3
+ export * from "./arithmeticFindExplicitFormulaFirstRankOne.js";
3
4
  export * from "./arithmeticFindReason.js";
4
5
  export * from "./arithmeticReasonUsage.js";
5
6
  export * from "./arithmeticRecurrenceFormulaUsage.js";
@@ -14,5 +15,6 @@ export * from "./arithmeticFindExplictFormulaFirstTermRandom.js";
14
15
  export * from "./arithmeticFindReasonRandomRange.js";
15
16
  export * from "./arithmeticFindRandomTermFromTwoTerms.js";
16
17
  export * from "./arithmeticFindTerm.js";
18
+ export * from "./arithmeticFindTermFirstRankOne.js";
17
19
  export * from "./arithmeticFindAntecedent.js";
18
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/sequences/arithmetic/index.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC;AACpD,cAAc,oCAAoC,CAAC;AACnD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uCAAuC,CAAC;AACtD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wCAAwC,CAAC;AACvD,cAAc,oCAAoC,CAAC;AACnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kDAAkD,CAAC;AACjE,cAAc,sCAAsC,CAAC;AACrD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/sequences/arithmetic/index.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC;AAEpD,cAAc,oCAAoC,CAAC;AACnD,cAAc,gDAAgD,CAAC;AAE/D,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uCAAuC,CAAC;AACtD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wCAAwC,CAAC;AACvD,cAAc,oCAAoC,CAAC;AACnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kDAAkD,CAAC;AACjE,cAAc,sCAAsC,CAAC;AACrD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,yBAAyB,CAAC;AACxC,cAAc,qCAAqC,CAAC;AACpD,cAAc,+BAA+B,CAAC"}
@@ -1,5 +1,6 @@
1
1
  export * from "./arithmeticExplicitFormulaUsage.js";
2
2
  export * from "./arithmeticFindExplicitFormula.js";
3
+ export * from "./arithmeticFindExplicitFormulaFirstRankOne.js";
3
4
  export * from "./arithmeticFindReason.js";
4
5
  export * from "./arithmeticReasonUsage.js";
5
6
  export * from "./arithmeticRecurrenceFormulaUsage.js";
@@ -14,4 +15,5 @@ export * from "./arithmeticFindExplictFormulaFirstTermRandom.js";
14
15
  export * from "./arithmeticFindReasonRandomRange.js";
15
16
  export * from "./arithmeticFindRandomTermFromTwoTerms.js";
16
17
  export * from "./arithmeticFindTerm.js";
18
+ export * from "./arithmeticFindTermFirstRankOne.js";
17
19
  export * from "./arithmeticFindAntecedent.js";
@@ -1 +1 @@
1
- {"version":3,"file":"genericSequenceVariations.d.ts","sourceRoot":"","sources":["../../../../src/exercises/math/sequences/genericSequenceVariations.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,QAAQ,EAUT,MAAM,6BAA6B,CAAC;AAQrC,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAqEF,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,WAAW,CAc3D,CAAC"}
1
+ {"version":3,"file":"genericSequenceVariations.d.ts","sourceRoot":"","sources":["../../../../src/exercises/math/sequences/genericSequenceVariations.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,QAAQ,EAUT,MAAM,6BAA6B,CAAC;AAQrC,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAyEF,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,WAAW,CAc3D,CAAC"}
@@ -5,7 +5,11 @@ import { randint } from "../../../math/utils/random/randint.js";
5
5
  const getInstruction = (identifiers) => {
6
6
  const { coeffs } = identifiers;
7
7
  const u = new Polynomial(coeffs, "n");
8
- return `Soit $u$ la suite définie par $u_n = ${u.toTree().toTex()}$.
8
+ return `Soit $u$ la suite définie par :
9
+
10
+ $$
11
+ u_n = ${u.toTree().toTex()}
12
+ $$
9
13
 
10
14
  Quel est le sens de variations de $u$ ?`;
11
15
  };
@@ -1 +1 @@
1
- {"version":3,"file":"geometricExplicitFormulaUsage.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/sequences/geometric/geometricExplicitFormulaUsage.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAeT,MAAM,6BAA6B,CAAC;AAYrC,KAAK,WAAW,GAAG;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAkGF,eAAO,MAAM,6BAA6B,EAAE,QAAQ,CAAC,WAAW,CAmB/D,CAAC"}
1
+ {"version":3,"file":"geometricExplicitFormulaUsage.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/sequences/geometric/geometricExplicitFormulaUsage.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAeT,MAAM,6BAA6B,CAAC;AAYrC,KAAK,WAAW,GAAG;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAwGF,eAAO,MAAM,6BAA6B,EAAE,QAAQ,CAAC,WAAW,CAmB/D,CAAC"}
@@ -13,7 +13,13 @@ const getInstruction = (identifiers) => {
13
13
  const { firstValue, reason, askedRank } = identifiers;
14
14
  const formula = new MultiplyNode(new NumberNode(firstValue), new PowerNode(new NumberNode(reason), new VariableNode("n")));
15
15
  const formulaTex = formula.toTex();
16
- return `$(u_n)$ est une suite géométrique définie par $u_n = ${formulaTex}$. Calculer : $u_{${askedRank}}$`;
16
+ return `$(u_n)$ est une suite géométrique définie par :
17
+
18
+ $$
19
+ u_n = ${formulaTex}
20
+ $$
21
+
22
+ Calculer le terme $u_{${askedRank}}$.`;
17
23
  };
18
24
  const getAnswer = (identifiers) => {
19
25
  const { firstValue, reason, askedRank } = identifiers;
@@ -1 +1 @@
1
- {"version":3,"file":"geometricFindExplicitFormula.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/sequences/geometric/geometricFindExplicitFormula.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAcT,MAAM,6BAA6B,CAAC;AAcrC,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AA8HF,eAAO,MAAM,4BAA4B,EAAE,QAAQ,CAAC,WAAW,CAc9D,CAAC"}
1
+ {"version":3,"file":"geometricFindExplicitFormula.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/sequences/geometric/geometricFindExplicitFormula.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAcT,MAAM,6BAA6B,CAAC;AAcrC,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AA8HF,eAAO,MAAM,4BAA4B,EAAE,QAAQ,CAAC,WAAW,CAe9D,CAAC"}
@@ -98,7 +98,7 @@ const isAnswerValid = (ans, { reason, firstValue }) => {
98
98
  export const geometricFindExplicitFormula = {
99
99
  id: "geometricFindExplicitFormula",
100
100
  connector: "=",
101
- label: "Déterminer la formule générale d'une suite géométrique",
101
+ label: "Déterminer la formule générale d'une suite géométrique (premier rang $u_0$)",
102
102
  isSingleStep: false,
103
103
  generator: (nb) => getDistinctQuestions(getGeometricFindExplicitFormula, nb),
104
104
  qcmTimer: 60,