math-exercises 3.0.215 → 3.0.217

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 (128) hide show
  1. package/lib/exercises/math/arithmetic/whichDayInXDays.d.ts.map +1 -1
  2. package/lib/exercises/math/arithmetic/whichDayInXDays.js +2 -1
  3. package/lib/exercises/math/calculLitteral/equation/exp/expOfFEqualsExpOfGEquation.d.ts.map +1 -1
  4. package/lib/exercises/math/calculLitteral/equation/exp/expOfFEqualsExpOfGEquation.js +19 -32
  5. package/lib/exercises/math/complex/unitRoots/giveOneSolutionToComplexPowNEqualsOne.js +1 -1
  6. package/lib/exercises/math/conversion/clock/index.d.ts +0 -1
  7. package/lib/exercises/math/conversion/clock/index.d.ts.map +1 -1
  8. package/lib/exercises/math/conversion/clock/index.js +1 -1
  9. package/lib/exercises/math/derivation/derivative/trigo/sinCosDerivativeRewriteUsingCos2PlusSin2Equals1.js +2 -2
  10. package/lib/exercises/math/graphs/adjacentMatrixPath.d.ts +10 -0
  11. package/lib/exercises/math/graphs/adjacentMatrixPath.d.ts.map +1 -0
  12. package/lib/exercises/math/graphs/adjacentMatrixPath.js +89 -0
  13. package/lib/exercises/math/graphs/edgesNumberFromSummitsDegrees.d.ts +7 -0
  14. package/lib/exercises/math/graphs/edgesNumberFromSummitsDegrees.d.ts.map +1 -0
  15. package/lib/exercises/math/graphs/edgesNumberFromSummitsDegrees.js +98 -0
  16. package/lib/exercises/math/graphs/eulerianChainFromAdjacentMatrix.d.ts +8 -0
  17. package/lib/exercises/math/graphs/eulerianChainFromAdjacentMatrix.d.ts.map +1 -0
  18. package/lib/exercises/math/graphs/eulerianChainFromAdjacentMatrix.js +96 -0
  19. package/lib/exercises/math/graphs/graphsChainOrPathOfLengthN.d.ts +15 -0
  20. package/lib/exercises/math/graphs/graphsChainOrPathOfLengthN.d.ts.map +1 -0
  21. package/lib/exercises/math/graphs/graphsChainOrPathOfLengthN.js +262 -0
  22. package/lib/exercises/math/graphs/graphsCheckIsConnectedGraph.d.ts +11 -0
  23. package/lib/exercises/math/graphs/graphsCheckIsConnectedGraph.d.ts.map +1 -0
  24. package/lib/exercises/math/graphs/graphsCheckIsConnectedGraph.js +178 -0
  25. package/lib/exercises/math/graphs/graphsCheckIsConnectedUndirectedGraph.d.ts +11 -0
  26. package/lib/exercises/math/graphs/graphsCheckIsConnectedUndirectedGraph.d.ts.map +1 -0
  27. package/lib/exercises/math/graphs/graphsCheckIsConnectedUndirectedGraph.js +178 -0
  28. package/lib/exercises/math/graphs/graphsCheckIsSameGraph.d.ts +19 -0
  29. package/lib/exercises/math/graphs/graphsCheckIsSameGraph.d.ts.map +1 -0
  30. package/lib/exercises/math/graphs/graphsCheckIsSameGraph.js +301 -0
  31. package/lib/exercises/math/graphs/graphsCheckIsVerticesAdjacent.d.ts +16 -0
  32. package/lib/exercises/math/graphs/graphsCheckIsVerticesAdjacent.d.ts.map +1 -0
  33. package/lib/exercises/math/graphs/graphsCheckIsVerticesAdjacent.js +207 -0
  34. package/lib/exercises/math/graphs/graphsDegreeOfVertex.d.ts +15 -0
  35. package/lib/exercises/math/graphs/graphsDegreeOfVertex.d.ts.map +1 -0
  36. package/lib/exercises/math/graphs/graphsDegreeOfVertex.js +232 -0
  37. package/lib/exercises/math/graphs/graphsOrderOfGraph.d.ts +14 -0
  38. package/lib/exercises/math/graphs/graphsOrderOfGraph.d.ts.map +1 -0
  39. package/lib/exercises/math/graphs/graphsOrderOfGraph.js +222 -0
  40. package/lib/exercises/math/graphs/index.d.ts +10 -0
  41. package/lib/exercises/math/graphs/index.d.ts.map +1 -0
  42. package/lib/exercises/math/graphs/index.js +9 -0
  43. package/lib/exercises/math/index.d.ts +1 -0
  44. package/lib/exercises/math/index.d.ts.map +1 -1
  45. package/lib/exercises/math/index.js +1 -0
  46. package/lib/exercises/math/integration/fromExpr/integralFromExpr.d.ts.map +1 -1
  47. package/lib/exercises/math/integration/fromExpr/integralFromExpr.js +2 -0
  48. package/lib/exercises/math/matrices/areMatricesInverse.d.ts +9 -0
  49. package/lib/exercises/math/matrices/areMatricesInverse.d.ts.map +1 -0
  50. package/lib/exercises/math/matrices/areMatricesInverse.js +106 -0
  51. package/lib/exercises/math/matrices/computeFixedMatrixInRecurrenceSequence.d.ts +9 -0
  52. package/lib/exercises/math/matrices/computeFixedMatrixInRecurrenceSequence.d.ts.map +1 -0
  53. package/lib/exercises/math/matrices/computeFixedMatrixInRecurrenceSequence.js +144 -0
  54. package/lib/exercises/math/matrices/findInversedMatrixFromSystem.d.ts +8 -0
  55. package/lib/exercises/math/matrices/findInversedMatrixFromSystem.d.ts.map +1 -0
  56. package/lib/exercises/math/matrices/findInversedMatrixFromSystem.js +148 -0
  57. package/lib/exercises/math/matrices/index.d.ts +12 -0
  58. package/lib/exercises/math/matrices/index.d.ts.map +1 -1
  59. package/lib/exercises/math/matrices/index.js +12 -0
  60. package/lib/exercises/math/matrices/isMatrixTransitionMatrix.d.ts +8 -0
  61. package/lib/exercises/math/matrices/isMatrixTransitionMatrix.d.ts.map +1 -0
  62. package/lib/exercises/math/matrices/isMatrixTransitionMatrix.js +132 -0
  63. package/lib/exercises/math/matrices/matrixBuildMatrixFromCoefficients.d.ts +8 -0
  64. package/lib/exercises/math/matrices/matrixBuildMatrixFromCoefficients.d.ts.map +1 -0
  65. package/lib/exercises/math/matrices/matrixBuildMatrixFromCoefficients.js +152 -0
  66. package/lib/exercises/math/matrices/matrixCheckIsSymmetrical.d.ts +8 -0
  67. package/lib/exercises/math/matrices/matrixCheckIsSymmetrical.d.ts.map +1 -0
  68. package/lib/exercises/math/matrices/matrixCheckIsSymmetrical.js +155 -0
  69. package/lib/exercises/math/matrices/matrixComputeDetOfMat2.d.ts +8 -0
  70. package/lib/exercises/math/matrices/matrixComputeDetOfMat2.d.ts.map +1 -0
  71. package/lib/exercises/math/matrices/matrixComputeDetOfMat2.js +142 -0
  72. package/lib/exercises/math/matrices/matrixComputeInverseOfMat2.d.ts +8 -0
  73. package/lib/exercises/math/matrices/matrixComputeInverseOfMat2.d.ts.map +1 -0
  74. package/lib/exercises/math/matrices/matrixComputeInverseOfMat2.js +237 -0
  75. package/lib/exercises/math/matrices/matrixComputeLinearCombination.d.ts +15 -0
  76. package/lib/exercises/math/matrices/matrixComputeLinearCombination.d.ts.map +1 -0
  77. package/lib/exercises/math/matrices/matrixComputeLinearCombination.js +232 -0
  78. package/lib/exercises/math/matrices/matrixComputePower.d.ts +12 -0
  79. package/lib/exercises/math/matrices/matrixComputePower.d.ts.map +1 -0
  80. package/lib/exercises/math/matrices/matrixComputePower.js +230 -0
  81. package/lib/exercises/math/matrices/matrixComputeProduct.d.ts +9 -0
  82. package/lib/exercises/math/matrices/matrixComputeProduct.d.ts.map +1 -0
  83. package/lib/exercises/math/matrices/matrixComputeProduct.js +178 -0
  84. package/lib/exercises/math/matrices/writeMatrixAssociatedToSystem.d.ts +8 -0
  85. package/lib/exercises/math/matrices/writeMatrixAssociatedToSystem.d.ts.map +1 -0
  86. package/lib/exercises/math/matrices/writeMatrixAssociatedToSystem.js +105 -0
  87. package/lib/exercises/math/spaceGeometry/parametricLine/lineLineRelativePositionsFromParametricLines.d.ts.map +1 -1
  88. package/lib/exercises/math/spaceGeometry/parametricLine/lineLineRelativePositionsFromParametricLines.js +56 -3
  89. package/lib/exercises/math/spaceGeometry/planes/findNormalVectorFromPlaneEquation.d.ts.map +1 -1
  90. package/lib/exercises/math/spaceGeometry/planes/findNormalVectorFromPlaneEquation.js +6 -0
  91. package/lib/exercises/vea/matrixVEA.d.ts +2 -0
  92. package/lib/exercises/vea/matrixVEA.d.ts.map +1 -0
  93. package/lib/exercises/vea/matrixVEA.js +1 -0
  94. package/lib/exercises/vea/treeTableVEA.d.ts.map +1 -1
  95. package/lib/exercises/vea/treeTableVEA.js +2 -0
  96. package/lib/index.d.ts +86 -13
  97. package/lib/index.d.ts.map +1 -1
  98. package/lib/math/geometry/point.d.ts.map +1 -1
  99. package/lib/math/geometry/point.js +3 -1
  100. package/lib/math/graphs/graph.d.ts +43 -0
  101. package/lib/math/graphs/graph.d.ts.map +1 -0
  102. package/lib/math/graphs/graph.js +447 -0
  103. package/lib/math/matrices/matrix.d.ts +42 -3
  104. package/lib/math/matrices/matrix.d.ts.map +1 -1
  105. package/lib/math/matrices/matrix.js +173 -7
  106. package/lib/math/matrices/parseMatrix.d.ts +3 -0
  107. package/lib/math/matrices/parseMatrix.d.ts.map +1 -0
  108. package/lib/math/matrices/parseMatrix.js +22 -0
  109. package/lib/math/systems/generalSystem.d.ts +2 -0
  110. package/lib/math/systems/generalSystem.d.ts.map +1 -1
  111. package/lib/math/systems/generalSystem.js +5 -0
  112. package/lib/math/utils/graphs/graphRenderer.d.ts +25 -0
  113. package/lib/math/utils/graphs/graphRenderer.d.ts.map +1 -0
  114. package/lib/math/utils/graphs/graphRenderer.js +123 -0
  115. package/lib/playground.d.ts +6 -1
  116. package/lib/playground.d.ts.map +1 -1
  117. package/lib/playground.js +6 -5
  118. package/lib/tree/parsers/latexParser.d.ts +1 -1
  119. package/lib/tree/utilities/nodeSimplifier.d.ts +1 -1
  120. package/lib/types/keyIds.d.ts +2 -0
  121. package/lib/types/keyIds.d.ts.map +1 -1
  122. package/lib/utils/arrays/arrayChunks.d.ts +9 -0
  123. package/lib/utils/arrays/arrayChunks.d.ts.map +1 -0
  124. package/lib/utils/arrays/arrayChunks.js +34 -0
  125. package/lib/utils/strings/ordinalSuffixed.d.ts +2 -0
  126. package/lib/utils/strings/ordinalSuffixed.d.ts.map +1 -0
  127. package/lib/utils/strings/ordinalSuffixed.js +5 -0
  128. package/package.json +7 -1
@@ -0,0 +1,262 @@
1
+ import { addValidProp, shuffleProps, tryToAddWrongProp, propWhile, GeneratorOptionTarget, GeneratorOptionType, } from "../../../exercises/exercise.js";
2
+ import { getDistinctQuestions } from "../../../exercises/utils/getDistinctQuestions.js";
3
+ import { defaultArrayedOptsWhereNeeded } from "../../../exercises/utils/options/arrayedOptions.js";
4
+ import { GeogebraConstructor } from "../../../geogebra/geogebraConstructor.js";
5
+ import { Point } from "../../../math/geometry/point.js";
6
+ import { GraphConstructor } from "../../../math/graphs/graph.js";
7
+ import { GraphRenderer, } from "../../../math/utils/graphs/graphRenderer.js";
8
+ import { randint } from "../../../math/utils/random/randint.js";
9
+ import { coinFlip } from "../../../utils/alea/coinFlip.js";
10
+ import { random } from "../../../utils/alea/random.js";
11
+ import { handleVEAError } from "../../../utils/errors/handleVEAError.js";
12
+ const getStrSeparator = (isDirected) => isDirected ? "\\ \\rightarrow\\ " : "\\ -\\ ";
13
+ const getHydrated = (identifiers) => {
14
+ const { graphIds, lengthAsked } = identifiers;
15
+ const graph = GraphConstructor.fromIdentifiers(graphIds);
16
+ const arrTexPath = [...Array(3).keys()]
17
+ .flatMap(() => graph
18
+ .getSomePathsWithNbEdges(lengthAsked, 1)
19
+ .map((arrIndex) => arrIndex.map((i) => graph.vertexNames[i]))
20
+ .map((arrNameVertex) => arrNameVertex.join(getStrSeparator(graph.isDirected))))
21
+ .filter((texPath) => texPath !== "");
22
+ return {
23
+ graph,
24
+ arrTexPath,
25
+ };
26
+ };
27
+ const getInstruction = (identifiers) => {
28
+ const { graphIds, lengthAsked } = identifiers;
29
+ return `Un graphe ${graphIds.isDirected ? "orienté" : "non orienté"} est représenté ci-dessous.
30
+ Déterminer ${graphIds.isDirected ? "un chemin" : "une chaîne"} de longueur $${lengthAsked}$ ?`;
31
+ };
32
+ const getAnswer = (identifiers) => {
33
+ const { arrTexPath } = getHydrated(identifiers);
34
+ const [texPath] = arrTexPath;
35
+ return texPath;
36
+ };
37
+ const getHint = (identifiers) => {
38
+ const { graphIds: { isDirected }, lengthAsked, } = identifiers;
39
+ if (isDirected) {
40
+ return `Cherche une succession de $${lengthAsked}$ flèches, puis inscrit le chemin sous la forme : $P\\ \\rightarrow \\ Q\\ \\rightarrow \\ R\\ \\rightarrow \\ ...$`;
41
+ }
42
+ else {
43
+ return `Cherche une succession de $${lengthAsked}$ arêtes, puis inscrit la chaîne sous la forme : $P\\ - \\ Q\\ - \\ R \\ - \\ ...$`;
44
+ }
45
+ };
46
+ const getCorrection = (identifiers) => {
47
+ const { graphIds: { isDirected }, lengthAsked, } = identifiers;
48
+ const { arrTexPath } = getHydrated(identifiers);
49
+ if (isDirected) {
50
+ return `Voici quelque(s) chemin(s) de longueur $${lengthAsked}$ :
51
+
52
+ ${arrTexPath.map((texPath) => `- $${texPath}$`).join(`
53
+
54
+ `)}`;
55
+ }
56
+ else {
57
+ return `Voici quelque(s) chaîne(s) de longueur $${lengthAsked}$ :
58
+
59
+ ${arrTexPath.map((texPath) => `- $${texPath}$`).join(`
60
+
61
+ `)}`;
62
+ }
63
+ };
64
+ const getGGBOptions = (identifiers) => {
65
+ const { graphNodes, graphEdges } = identifiers;
66
+ const { graph } = getHydrated(identifiers);
67
+ const arrPoint = graphNodes.map(({ label, x, y }) => new Point(label, x, y));
68
+ const pointCommands = arrPoint.flatMap((point) => point.toGGBCommand({
69
+ isFixed: false,
70
+ isSelectionnable: true,
71
+ showLabel: true,
72
+ style: 0,
73
+ size: 8,
74
+ }));
75
+ const edgeCommands = graphEdges.map((e, i) => graph.isDirected
76
+ ? `v${i + 1} = Vector(${e.from}, ${e.to})`
77
+ : `s${i + 1} = Segment(${e.from}, ${e.to})`);
78
+ const arrGGBCommandForGraph = [...pointCommands, ...edgeCommands];
79
+ const ggb = new GeogebraConstructor({
80
+ commands: [...arrGGBCommandForGraph],
81
+ fontSize: 16,
82
+ hideAxes: true,
83
+ hideGrid: true,
84
+ });
85
+ return ggb.getOptions({
86
+ coords: ggb.getCoordsForPoints(arrPoint),
87
+ });
88
+ };
89
+ const getPropositions = (n, { answer, ...identifiers }) => {
90
+ const propositions = [];
91
+ addValidProp(propositions, answer);
92
+ const { lengthAsked: lengthAskedPure } = identifiers;
93
+ const { graph } = getHydrated(identifiers);
94
+ const lengthAsked = (() => {
95
+ const isTerror = coinFlip();
96
+ return isTerror ? lengthAskedPure - 1 : lengthAskedPure;
97
+ })();
98
+ //student: number of edges -> number of nodes
99
+ {
100
+ const identifiersWrong = {
101
+ ...identifiers,
102
+ lengthAsked: lengthAsked - 1,
103
+ };
104
+ tryToAddWrongProp(propositions, getAnswer(identifiersWrong));
105
+ }
106
+ if (graph.isDirected) {
107
+ const graphUndirected = graph.undirectedGraph();
108
+ //student: path -> chain
109
+ {
110
+ const arrTexPath = [...Array(2).keys()]
111
+ .flatMap(() => graphUndirected
112
+ .getSomePathsWithNbEdges(lengthAsked, 1)
113
+ .map((arrIndex) => arrIndex.map((i) => graph.vertexNames[i]))
114
+ .filter((arrName) => !graph.isValidPath(arrName)))
115
+ .map((arrNameVertex) => arrNameVertex.join(getStrSeparator(graph.isDirected)));
116
+ arrTexPath.forEach((texPath) => {
117
+ tryToAddWrongProp(propositions, texPath);
118
+ });
119
+ }
120
+ }
121
+ //filler
122
+ {
123
+ function createRandomPath(vertexNames, length) {
124
+ const arrIndexVertex = [...Array(length).keys()].reduce((acc, _) => {
125
+ const indexPrev = acc[acc.length - 1];
126
+ const index = randint(0, vertexNames.length, [indexPrev]);
127
+ return [...acc, index];
128
+ }, [randint(0, vertexNames.length)]);
129
+ return arrIndexVertex.map((i) => vertexNames[i]);
130
+ }
131
+ propWhile(propositions, n, () => {
132
+ const arrVertex = createRandomPath(graph.vertexNames, lengthAsked);
133
+ if (!graph.isValidPath(arrVertex)) {
134
+ const texPath = arrVertex.join(getStrSeparator(graph.isDirected));
135
+ tryToAddWrongProp(propositions, texPath);
136
+ }
137
+ if (coinFlip()) {
138
+ if (lengthAsked >= 3) {
139
+ const arrVertex = createRandomPath(graph.vertexNames, lengthAsked - 1);
140
+ if (!graph.isValidPath(arrVertex)) {
141
+ const texPath = arrVertex.join(getStrSeparator(graph.isDirected));
142
+ tryToAddWrongProp(propositions, texPath);
143
+ }
144
+ }
145
+ }
146
+ });
147
+ }
148
+ return shuffleProps(propositions, n);
149
+ };
150
+ const getKeys = (identifiers) => {
151
+ const { graphIds: { vertexNames, isDirected }, } = identifiers;
152
+ return [
153
+ ...vertexNames,
154
+ (() => {
155
+ const tex = getStrSeparator(isDirected);
156
+ return {
157
+ id: "custom",
158
+ label: tex,
159
+ labelType: "tex",
160
+ mathfieldInstructions: {
161
+ method: "write",
162
+ content: tex,
163
+ },
164
+ };
165
+ })(),
166
+ ];
167
+ };
168
+ const isAnswerValid = (ans, { answer, ...identifiers }) => {
169
+ try {
170
+ const { graphIds: { isDirected }, lengthAsked, } = identifiers;
171
+ const strSeparator = getStrSeparator(isDirected);
172
+ const arrNameVertexAns = ans.split(strSeparator);
173
+ console.log("arrNameVertexAns", arrNameVertexAns);
174
+ if (arrNameVertexAns.length !== lengthAsked + 1) {
175
+ return false;
176
+ }
177
+ const { graph } = getHydrated(identifiers);
178
+ return graph.isValidPath(arrNameVertexAns);
179
+ }
180
+ catch (err) {
181
+ return handleVEAError(err);
182
+ }
183
+ };
184
+ const createRandomIdentifiers = (isDirected) => {
185
+ const nbVertices = randint(5, 9);
186
+ const minDensity = (() => {
187
+ switch (nbVertices) {
188
+ case 5:
189
+ return isDirected ? 0.4 : 0.62;
190
+ case 6:
191
+ return isDirected ? 0.35 : 0.57;
192
+ case 7:
193
+ return isDirected ? 0.3 : 0.52;
194
+ case 8:
195
+ return isDirected ? 0.27 : 0.37;
196
+ case 9:
197
+ return isDirected ? 0.24 : 0.32;
198
+ default:
199
+ throw new Error("Unsupported nbVertices: " + nbVertices);
200
+ }
201
+ })();
202
+ const lengthAsked = randint(3, 4);
203
+ const graph = GraphConstructor.randomChain(nbVertices, "ABCDEFGHIJKLM".split(""), isDirected).densifyUpTo(minDensity);
204
+ const { nodes: graphNodes, edges: graphEdges } = GraphRenderer.renderToNodesAndEdges(graph);
205
+ const identifiers = {
206
+ graphIds: graph.toIdentifiers(),
207
+ lengthAsked,
208
+ graphNodes,
209
+ graphEdges,
210
+ };
211
+ return identifiers;
212
+ };
213
+ const getGraphsChainOrPathOfLengthNQuestion = (optsIn) => {
214
+ const arrayedOpts = defaultArrayedOptsWhereNeeded(optsIn, arrayedOptsDefault);
215
+ const opts = {
216
+ graphType: random(arrayedOpts.graphType),
217
+ };
218
+ const isDirected = opts.graphType === "orienté";
219
+ const identifiers = createRandomIdentifiers(isDirected);
220
+ return getQuestionFromIdentifiers(identifiers);
221
+ };
222
+ const getQuestionFromIdentifiers = (identifiers, opts) => {
223
+ const question = {
224
+ answer: getAnswer(identifiers, opts),
225
+ instruction: getInstruction(identifiers, opts),
226
+ keys: getKeys(identifiers, opts),
227
+ answerFormat: "tex",
228
+ identifiers,
229
+ hint: getHint(identifiers, opts),
230
+ correction: getCorrection(identifiers, opts),
231
+ ggbOptions: getGGBOptions(identifiers, opts),
232
+ };
233
+ return question;
234
+ };
235
+ const arrayedOptsDefault = {
236
+ graphType: ["non orienté"],
237
+ };
238
+ const options = [
239
+ {
240
+ id: "graphType",
241
+ label: "Types de graphes",
242
+ target: GeneratorOptionTarget.generation,
243
+ type: GeneratorOptionType.multiselect,
244
+ values: ["non orienté", "orienté"],
245
+ defaultValue: arrayedOptsDefault.graphType,
246
+ },
247
+ ];
248
+ export const graphsChainOrPathOfLengthN = {
249
+ id: "graphsChainOrPathOfLengthN",
250
+ label: "Déterminer une chaîne ou un chemin de longueur $n$",
251
+ isSingleStep: true,
252
+ generator: (nb, opts) => getDistinctQuestions(() => getGraphsChainOrPathOfLengthNQuestion(opts), nb),
253
+ options,
254
+ qcmTimer: 60,
255
+ freeTimer: 60,
256
+ isAnswerValid,
257
+ getPropositions,
258
+ subject: "Mathématiques",
259
+ getQuestionFromIdentifiers,
260
+ hasHintAndCorrection: true,
261
+ hasGeogebra: true,
262
+ };
@@ -0,0 +1,11 @@
1
+ import { Exercise } from "../../../exercises/exercise.js";
2
+ import { GraphIdentifiers } from "../../../math/graphs/graph.js";
3
+ import { GraphEdge, GraphNode } from "../../../math/utils/graphs/graphRenderer.js";
4
+ type Identifiers = {
5
+ graphIds: GraphIdentifiers;
6
+ graphNodes: GraphNode[];
7
+ graphEdges: GraphEdge[];
8
+ };
9
+ export declare const graphsCheckIsConnectedGraph: Exercise<Identifiers>;
10
+ export {};
11
+ //# sourceMappingURL=graphsCheckIsConnectedGraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphsCheckIsConnectedGraph.d.ts","sourceRoot":"","sources":["../../../../src/exercises/math/graphs/graphsCheckIsConnectedGraph.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAaT,MAAM,6BAA6B,CAAC;AAIrC,OAAO,EAGL,gBAAgB,EACjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,SAAS,EACT,SAAS,EAEV,MAAM,0CAA0C,CAAC;AASlD,KAAK,WAAW,GAAG;IACjB,QAAQ,EAAE,gBAAgB,CAAC;IAG3B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB,CAAC;AA2OF,eAAO,MAAM,2BAA2B,EAAE,QAAQ,CAAC,WAAW,CAiB7D,CAAC"}
@@ -0,0 +1,178 @@
1
+ import { addValidProp, tryToAddWrongProp, } from "../../../exercises/exercise.js";
2
+ import { getDistinctQuestions } from "../../../exercises/utils/getDistinctQuestions.js";
3
+ import { GeogebraConstructor } from "../../../geogebra/geogebraConstructor.js";
4
+ import { Point } from "../../../math/geometry/point.js";
5
+ import { GraphConstructor, } from "../../../math/graphs/graph.js";
6
+ import { GraphRenderer, } from "../../../math/utils/graphs/graphRenderer.js";
7
+ import { randint } from "../../../math/utils/random/randint.js";
8
+ import { coinFlip } from "../../../utils/alea/coinFlip.js";
9
+ import { shuffle } from "../../../utils/alea/shuffle.js";
10
+ import { splitIntoRandomChunks } from "../../../utils/arrays/arrayChunks.js";
11
+ import { joinanded } from "../../../utils/strings/joinanded.js";
12
+ import * as Flatten from "@flatten-js/core";
13
+ const getHydrated = (identifiers) => {
14
+ const { graphIds } = identifiers;
15
+ const graph = GraphConstructor.fromIdentifiers(graphIds);
16
+ return {
17
+ graph,
18
+ };
19
+ };
20
+ const getInstruction = () => {
21
+ return `Un graphe non orienté est représenté ci-dessous.
22
+ Le graphe est-il connexe ?
23
+ *On peut déplacer les points sur la figure.*`;
24
+ };
25
+ const getAnswer = (identifiers) => {
26
+ const { graph } = getHydrated(identifiers);
27
+ return graph.isWeaklyConnected() ? "Oui" : "Non";
28
+ };
29
+ const getHint = () => {
30
+ return `Un graphe non orienté est connexe si et seulement si chaque couple de ses sommets peut être relié par une chaîne.`;
31
+ };
32
+ const getCorrection = (identifiers) => {
33
+ const { graph } = getHydrated(identifiers);
34
+ const arrWeaklyConnectedSubgraph = graph
35
+ .getWeaklyConnectedSubgraphCoveringChainsAsArrIndex()
36
+ .map((chain) => chain.map((index) => graph.vertexNames[index]));
37
+ if (graph.isWeaklyConnected()) {
38
+ const [chain0] = arrWeaklyConnectedSubgraph;
39
+ return `On peut former une chaîne qui relie tous les sommets : ${chain0
40
+ .map((str) => `$${str}$`)
41
+ .join("-")}.
42
+ Le graphe est donc connexe.`;
43
+ }
44
+ else {
45
+ return `On ne peut pas former une chaîne qui relie tous les sommets.
46
+ Le graphe contient des sous-graphes disjoints contenant les chaînes ${joinanded(arrWeaklyConnectedSubgraph.map((chain) => chain.map((str) => `$${str}$`).join("-")), ", ", " et ")}.
47
+ Le graphe n'est donc pas connexe.`;
48
+ }
49
+ };
50
+ const getGGBOptions = (identifiers) => {
51
+ const { graphNodes, graphEdges } = identifiers;
52
+ const { graph } = getHydrated(identifiers);
53
+ const arrPoint = graphNodes.map(({ label, x, y }) => new Point(label, x, y));
54
+ const pointCommands = arrPoint.flatMap((point) => point.toGGBCommand({
55
+ isFixed: false,
56
+ isSelectionnable: true,
57
+ showLabel: true,
58
+ style: 0,
59
+ size: 8,
60
+ }));
61
+ const edgeCommands = graphEdges.map((e, i) => graph.isDirected
62
+ ? `v${i + 1} = Vector(${e.from}, ${e.to})`
63
+ : `s${i + 1} = Segment(${e.from}, ${e.to})`);
64
+ const arrGGBCommandForGraph = [...pointCommands, ...edgeCommands];
65
+ const ggb = new GeogebraConstructor({
66
+ commands: [...arrGGBCommandForGraph],
67
+ fontSize: 16,
68
+ hideAxes: true,
69
+ hideGrid: true,
70
+ });
71
+ return ggb.getOptions({
72
+ coords: ggb.getCoordsForPoints(arrPoint),
73
+ });
74
+ };
75
+ const getPropositions = (_, { answer }) => {
76
+ const propositions = [];
77
+ ["Oui", "Non"].forEach((str) => {
78
+ if (str === answer) {
79
+ addValidProp(propositions, str, "raw");
80
+ }
81
+ else {
82
+ tryToAddWrongProp(propositions, str, "raw");
83
+ }
84
+ });
85
+ return propositions;
86
+ };
87
+ const createRandomIdentifiers = () => {
88
+ const nbVertices = randint(7, 9);
89
+ const isSimple = true;
90
+ const minDensity = 0.4;
91
+ const isConnected = coinFlip();
92
+ const vertexNames = "ABCDEFGHIJKLM".split("").slice(0, nbVertices);
93
+ const { graph, graphNodes, graphEdges } = (() => {
94
+ let isFound = false;
95
+ let graph;
96
+ let graphNodes;
97
+ let arrGraphEdges;
98
+ while (!isFound) {
99
+ const graphForPoints = GraphConstructor.randomConnected(nbVertices, isSimple, false, minDensity, vertexNames);
100
+ const { nodes: graphNodes0, edges: graphEdges0 } = GraphRenderer.renderToNodesAndEdges(graphForPoints, "circo");
101
+ graphNodes = graphNodes0;
102
+ let arrGraphNodes; //to check overlapping
103
+ [graph, arrGraphEdges, arrGraphNodes] = (() => {
104
+ if (isConnected) {
105
+ return [graphForPoints, [graphEdges0], [graphNodes0]];
106
+ }
107
+ else {
108
+ const arrVertexNamesChunk = splitIntoRandomChunks(shuffle(vertexNames), 3);
109
+ const arrSubGraph = arrVertexNamesChunk.map((vertexNamesChunk) => GraphConstructor.randomConnected(vertexNamesChunk.length, isSimple, false, minDensity, vertexNamesChunk));
110
+ const graph = GraphConstructor.graphByMergingSimpleGraphs(arrSubGraph);
111
+ const arrGraphEdges = arrSubGraph.map((graph) => graph.arrConnection().map(([from, to, _]) => {
112
+ return { from, to };
113
+ }));
114
+ const dictGraphNodes = Object.fromEntries(graphNodes.map((graphNode) => [graphNode.label, graphNode]));
115
+ const arrGraphNodes = arrSubGraph.map((graph) => graph.vertexNames.map((nameVertex) => dictGraphNodes[nameVertex]));
116
+ return [graph, arrGraphEdges, arrGraphNodes];
117
+ }
118
+ })();
119
+ const arrGraphNodes1GraphNodes2 = [...Array(arrGraphNodes.length).keys()]
120
+ .flatMap((i) => [...Array(i + 1).keys()].map((j) => [i, j]))
121
+ .map(([i, j]) => [arrGraphNodes[i], arrGraphNodes[j]]);
122
+ try {
123
+ isFound = arrGraphNodes1GraphNodes2.every(([graphNodes1, graphNodes2]) => {
124
+ const [polygon1, polygon2] = [graphNodes1, graphNodes2].map((graphNodes) => {
125
+ const arrPoint = graphNodes.map(({ x, y }) => new Flatten.Point(x, y));
126
+ const polygon = new Flatten.Polygon(arrPoint);
127
+ return polygon;
128
+ });
129
+ return Flatten.Relations.intersect(polygon1, polygon2);
130
+ });
131
+ }
132
+ catch {
133
+ isFound = false;
134
+ }
135
+ }
136
+ const graphEdges = arrGraphEdges.reduce((acc, graphEdges) => {
137
+ acc = [...acc, ...graphEdges];
138
+ return acc;
139
+ }, []);
140
+ return { graph: graph, graphNodes: graphNodes, graphEdges };
141
+ })();
142
+ const identifiers = {
143
+ graphIds: graph.toIdentifiers(),
144
+ graphNodes,
145
+ graphEdges,
146
+ };
147
+ return identifiers;
148
+ };
149
+ const getGraphsCheckIsConnectedGraphQuestion = () => {
150
+ const identifiers = createRandomIdentifiers();
151
+ return getQuestionFromIdentifiers(identifiers);
152
+ };
153
+ const getQuestionFromIdentifiers = (identifiers, opts) => {
154
+ const question = {
155
+ answer: getAnswer(identifiers, opts),
156
+ instruction: getInstruction(identifiers, opts),
157
+ answerFormat: "raw",
158
+ identifiers,
159
+ hint: getHint(identifiers, opts),
160
+ correction: getCorrection(identifiers, opts),
161
+ ggbOptions: getGGBOptions(identifiers, opts),
162
+ };
163
+ return question;
164
+ };
165
+ export const graphsCheckIsConnectedGraph = {
166
+ id: "graphsCheckIsConnectedGraph",
167
+ label: "Déterminer si un graphe est connexe",
168
+ isSingleStep: true,
169
+ generator: (nb, opts) => getDistinctQuestions(() => getGraphsCheckIsConnectedGraphQuestion(opts), nb),
170
+ qcmTimer: 60,
171
+ freeTimer: 60,
172
+ getPropositions,
173
+ subject: "Mathématiques",
174
+ getQuestionFromIdentifiers,
175
+ hasHintAndCorrection: true,
176
+ hasGeogebra: true,
177
+ answerType: "QCU",
178
+ };
@@ -0,0 +1,11 @@
1
+ import { Exercise } from "../../../exercises/exercise.js";
2
+ import { GraphIdentifiers } from "../../../math/graphs/graph.js";
3
+ import { GraphEdge, GraphNode } from "../../../math/utils/graphs/graphRenderer.js";
4
+ type Identifiers = {
5
+ graphIds: GraphIdentifiers;
6
+ graphNodes: GraphNode[];
7
+ graphEdges: GraphEdge[];
8
+ };
9
+ export declare const graphsCheckIsConnectedGraph: Exercise<Identifiers>;
10
+ export {};
11
+ //# sourceMappingURL=graphsCheckIsConnectedUndirectedGraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphsCheckIsConnectedUndirectedGraph.d.ts","sourceRoot":"","sources":["../../../../src/exercises/math/graphs/graphsCheckIsConnectedUndirectedGraph.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAaT,MAAM,6BAA6B,CAAC;AAIrC,OAAO,EAGL,gBAAgB,EACjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,SAAS,EACT,SAAS,EAEV,MAAM,0CAA0C,CAAC;AASlD,KAAK,WAAW,GAAG;IACjB,QAAQ,EAAE,gBAAgB,CAAC;IAG3B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB,CAAC;AA2OF,eAAO,MAAM,2BAA2B,EAAE,QAAQ,CAAC,WAAW,CAiB7D,CAAC"}
@@ -0,0 +1,178 @@
1
+ import { addValidProp, tryToAddWrongProp, } from "../../../exercises/exercise.js";
2
+ import { getDistinctQuestions } from "../../../exercises/utils/getDistinctQuestions.js";
3
+ import { GeogebraConstructor } from "../../../geogebra/geogebraConstructor.js";
4
+ import { Point } from "../../../math/geometry/point.js";
5
+ import { GraphConstructor, } from "../../../math/graphs/graph.js";
6
+ import { GraphRenderer, } from "../../../math/utils/graphs/graphRenderer.js";
7
+ import { randint } from "../../../math/utils/random/randint.js";
8
+ import { coinFlip } from "../../../utils/alea/coinFlip.js";
9
+ import { shuffle } from "../../../utils/alea/shuffle.js";
10
+ import { splitIntoRandomChunks } from "../../../utils/arrays/arrayChunks.js";
11
+ import { joinanded } from "../../../utils/strings/joinanded.js";
12
+ import * as Flatten from "@flatten-js/core";
13
+ const getHydrated = (identifiers) => {
14
+ const { graphIds } = identifiers;
15
+ const graph = GraphConstructor.fromIdentifiers(graphIds);
16
+ return {
17
+ graph,
18
+ };
19
+ };
20
+ const getInstruction = () => {
21
+ return `Un graphe non orienté est représenté ci-dessous.
22
+ Le graphe est-il connexe ?
23
+ *On peut déplacer les points sur la figure.*`;
24
+ };
25
+ const getAnswer = (identifiers) => {
26
+ const { graph } = getHydrated(identifiers);
27
+ return graph.isWeaklyConnected() ? "Oui" : "Non";
28
+ };
29
+ const getHint = () => {
30
+ return `Un graphe non orienté est connexe si et seulement si chaque couple de ses sommets peut être relié par une chaîne.`;
31
+ };
32
+ const getCorrection = (identifiers) => {
33
+ const { graph } = getHydrated(identifiers);
34
+ const arrWeaklyConnectedSubgraph = graph
35
+ .getWeaklyConnectedSubgraphCoveringChainsAsArrIndex()
36
+ .map((chain) => chain.map((index) => graph.vertexNames[index]));
37
+ if (graph.isWeaklyConnected()) {
38
+ const [chain0] = arrWeaklyConnectedSubgraph;
39
+ return `On peut former une chaîne qui relie tous les sommets : ${chain0
40
+ .map((str) => `$${str}$`)
41
+ .join("-")}.
42
+ Le graphe est donc connexe.`;
43
+ }
44
+ else {
45
+ return `On ne peut pas former une chaîne qui relie tous les sommets.
46
+ Le graphe contient des sous-graphes disjoints contenant les chaînes ${joinanded(arrWeaklyConnectedSubgraph.map((chain) => chain.map((str) => `$${str}$`).join("-")), ", ", " et ")}.
47
+ Le graphe n'est donc pas connexe.`;
48
+ }
49
+ };
50
+ const getGGBOptions = (identifiers) => {
51
+ const { graphNodes, graphEdges } = identifiers;
52
+ const { graph } = getHydrated(identifiers);
53
+ const arrPoint = graphNodes.map(({ label, x, y }) => new Point(label, x, y));
54
+ const pointCommands = arrPoint.flatMap((point) => point.toGGBCommand({
55
+ isFixed: false,
56
+ isSelectionnable: true,
57
+ showLabel: true,
58
+ style: 0,
59
+ size: 8,
60
+ }));
61
+ const edgeCommands = graphEdges.map((e, i) => graph.isDirected
62
+ ? `v${i + 1} = Vector(${e.from}, ${e.to})`
63
+ : `s${i + 1} = Segment(${e.from}, ${e.to})`);
64
+ const arrGGBCommandForGraph = [...pointCommands, ...edgeCommands];
65
+ const ggb = new GeogebraConstructor({
66
+ commands: [...arrGGBCommandForGraph],
67
+ fontSize: 16,
68
+ hideAxes: true,
69
+ hideGrid: true,
70
+ });
71
+ return ggb.getOptions({
72
+ coords: ggb.getCoordsForPoints(arrPoint),
73
+ });
74
+ };
75
+ const getPropositions = (_, { answer }) => {
76
+ const propositions = [];
77
+ ["Oui", "Non"].forEach((str) => {
78
+ if (str === answer) {
79
+ addValidProp(propositions, str, "raw");
80
+ }
81
+ else {
82
+ tryToAddWrongProp(propositions, str, "raw");
83
+ }
84
+ });
85
+ return propositions;
86
+ };
87
+ const createRandomIdentifiers = () => {
88
+ const nbVertices = randint(7, 9);
89
+ const isSimple = true;
90
+ const minDensity = 0.4;
91
+ const isConnected = coinFlip();
92
+ const vertexNames = "ABCDEFGHIJKLM".split("").slice(0, nbVertices);
93
+ const { graph, graphNodes, graphEdges } = (() => {
94
+ let isFound = false;
95
+ let graph;
96
+ let graphNodes;
97
+ let arrGraphEdges;
98
+ while (!isFound) {
99
+ const graphForPoints = GraphConstructor.randomConnected(nbVertices, isSimple, false, minDensity, vertexNames);
100
+ const { nodes: graphNodes0, edges: graphEdges0 } = GraphRenderer.renderToNodesAndEdges(graphForPoints, "circo");
101
+ graphNodes = graphNodes0;
102
+ let arrGraphNodes; //to check overlapping
103
+ [graph, arrGraphEdges, arrGraphNodes] = (() => {
104
+ if (isConnected) {
105
+ return [graphForPoints, [graphEdges0], [graphNodes0]];
106
+ }
107
+ else {
108
+ const arrVertexNamesChunk = splitIntoRandomChunks(shuffle(vertexNames), 3);
109
+ const arrSubGraph = arrVertexNamesChunk.map((vertexNamesChunk) => GraphConstructor.randomConnected(vertexNamesChunk.length, isSimple, false, minDensity, vertexNamesChunk));
110
+ const graph = GraphConstructor.graphByMergingSimpleGraphs(arrSubGraph);
111
+ const arrGraphEdges = arrSubGraph.map((graph) => graph.arrConnection().map(([from, to, _]) => {
112
+ return { from, to };
113
+ }));
114
+ const dictGraphNodes = Object.fromEntries(graphNodes.map((graphNode) => [graphNode.label, graphNode]));
115
+ const arrGraphNodes = arrSubGraph.map((graph) => graph.vertexNames.map((nameVertex) => dictGraphNodes[nameVertex]));
116
+ return [graph, arrGraphEdges, arrGraphNodes];
117
+ }
118
+ })();
119
+ const arrGraphNodes1GraphNodes2 = [...Array(arrGraphNodes.length).keys()]
120
+ .flatMap((i) => [...Array(i + 1).keys()].map((j) => [i, j]))
121
+ .map(([i, j]) => [arrGraphNodes[i], arrGraphNodes[j]]);
122
+ try {
123
+ isFound = arrGraphNodes1GraphNodes2.every(([graphNodes1, graphNodes2]) => {
124
+ const [polygon1, polygon2] = [graphNodes1, graphNodes2].map((graphNodes) => {
125
+ const arrPoint = graphNodes.map(({ x, y }) => new Flatten.Point(x, y));
126
+ const polygon = new Flatten.Polygon(arrPoint);
127
+ return polygon;
128
+ });
129
+ return Flatten.Relations.intersect(polygon1, polygon2);
130
+ });
131
+ }
132
+ catch {
133
+ isFound = false;
134
+ }
135
+ }
136
+ const graphEdges = arrGraphEdges.reduce((acc, graphEdges) => {
137
+ acc = [...acc, ...graphEdges];
138
+ return acc;
139
+ }, []);
140
+ return { graph: graph, graphNodes: graphNodes, graphEdges };
141
+ })();
142
+ const identifiers = {
143
+ graphIds: graph.toIdentifiers(),
144
+ graphNodes,
145
+ graphEdges,
146
+ };
147
+ return identifiers;
148
+ };
149
+ const getGraphsCheckIsConnectedGraphQuestion = () => {
150
+ const identifiers = createRandomIdentifiers();
151
+ return getQuestionFromIdentifiers(identifiers);
152
+ };
153
+ const getQuestionFromIdentifiers = (identifiers, opts) => {
154
+ const question = {
155
+ answer: getAnswer(identifiers, opts),
156
+ instruction: getInstruction(identifiers, opts),
157
+ answerFormat: "raw",
158
+ identifiers,
159
+ hint: getHint(identifiers, opts),
160
+ correction: getCorrection(identifiers, opts),
161
+ ggbOptions: getGGBOptions(identifiers, opts),
162
+ };
163
+ return question;
164
+ };
165
+ export const graphsCheckIsConnectedGraph = {
166
+ id: "graphsCheckIsConnectedGraph",
167
+ label: "Déterminer si un graphe est connexe",
168
+ isSingleStep: true,
169
+ generator: (nb, opts) => getDistinctQuestions(() => getGraphsCheckIsConnectedGraphQuestion(opts), nb),
170
+ qcmTimer: 60,
171
+ freeTimer: 60,
172
+ getPropositions,
173
+ subject: "Mathématiques",
174
+ getQuestionFromIdentifiers,
175
+ hasHintAndCorrection: true,
176
+ hasGeogebra: true,
177
+ answerType: "QCU",
178
+ };
@@ -0,0 +1,19 @@
1
+ import { Exercise } from "../../../exercises/exercise.js";
2
+ import { GraphIdentifiers } from "../../../math/graphs/graph.js";
3
+ import { GraphEdge, GraphNode } from "../../../math/utils/graphs/graphRenderer.js";
4
+ type Identifiers = {
5
+ graphIds1: GraphIdentifiers;
6
+ graphIds2: GraphIdentifiers;
7
+ graphNodes1: GraphNode[];
8
+ graphEdges1: GraphEdge[];
9
+ scale1: number;
10
+ graphNodes2: GraphNode[];
11
+ graphEdges2: GraphEdge[];
12
+ scale2: number;
13
+ };
14
+ type Options = {
15
+ graphType: string;
16
+ };
17
+ export declare const graphsCheckIsSameGraph: Exercise<Identifiers, Options>;
18
+ export {};
19
+ //# sourceMappingURL=graphsCheckIsSameGraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphsCheckIsSameGraph.d.ts","sourceRoot":"","sources":["../../../../src/exercises/math/graphs/graphsCheckIsSameGraph.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAgBT,MAAM,6BAA6B,CAAC;AAMrC,OAAO,EAEL,gBAAgB,EAEjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,SAAS,EACT,SAAS,EAEV,MAAM,0CAA0C,CAAC;AAQlD,KAAK,WAAW,GAAG;IACjB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,SAAS,EAAE,gBAAgB,CAAC;IAG5B,WAAW,EAAE,SAAS,EAAE,CAAC;IACzB,WAAW,EAAE,SAAS,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IAEf,WAAW,EAAE,SAAS,EAAE,CAAC;IACzB,WAAW,EAAE,SAAS,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAyXF,KAAK,OAAO,GAAG;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAsBF,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAejE,CAAC"}