math-exercises 3.0.170 → 3.0.172

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 (276) hide show
  1. package/lib/exercises/math/derivation/variations/signVarTable3dDegree.js +38 -10
  2. package/lib/exercises/math/derivation/variations/signVarTableFromDerivativeGraph.d.ts.map +1 -1
  3. package/lib/exercises/math/derivation/variations/signVarTableFromDerivativeGraph.js +7 -4
  4. package/lib/exercises/math/derivation/variations/signVarTableFromGraph.d.ts.map +1 -1
  5. package/lib/exercises/math/derivation/variations/signVarTableFromGraph.js +2 -3
  6. package/lib/exercises/math/functions/trinoms/problems/index.d.ts +1 -0
  7. package/lib/exercises/math/functions/trinoms/problems/index.d.ts.map +1 -1
  8. package/lib/exercises/math/functions/trinoms/problems/index.js +1 -0
  9. package/lib/exercises/math/functions/trinoms/problems/rectangleSizesFromPerimeterAndArea.d.ts +9 -0
  10. package/lib/exercises/math/functions/trinoms/problems/rectangleSizesFromPerimeterAndArea.d.ts.map +1 -0
  11. package/lib/exercises/math/functions/trinoms/problems/rectangleSizesFromPerimeterAndArea.js +202 -0
  12. package/lib/exercises/math/functions/variations/partialVarTableFromGraph.d.ts.map +1 -1
  13. package/lib/exercises/math/functions/variations/partialVarTableFromGraph.js +2 -1
  14. package/lib/exercises/math/functions/variations/varTableFromGraph.d.ts.map +1 -1
  15. package/lib/exercises/math/functions/variations/varTableFromGraph.js +2 -1
  16. package/lib/exercises/math/functions/variations/varTableFromSentences.d.ts.map +1 -1
  17. package/lib/exercises/math/functions/variations/varTableFromSentences.js +2 -1
  18. package/lib/exercises/math/geometry/circles/circleCenterAndRadiusFromEquation.d.ts.map +1 -1
  19. package/lib/exercises/math/geometry/circles/circleCenterAndRadiusFromEquation.js +0 -2
  20. package/lib/exercises/math/geometry/vectors/scalarProduct/alKashi/scalarProductAlKashiAngle.d.ts.map +1 -1
  21. package/lib/exercises/math/geometry/vectors/scalarProduct/alKashi/scalarProductAlKashiAngle.js +64 -60
  22. package/lib/exercises/math/geometry/vectors/scalarProduct/alKashi/scalarProductAlKashiBH.d.ts +1 -0
  23. package/lib/exercises/math/geometry/vectors/scalarProduct/alKashi/scalarProductAlKashiBH.d.ts.map +1 -1
  24. package/lib/exercises/math/geometry/vectors/scalarProduct/alKashi/scalarProductAlKashiBH.js +173 -47
  25. package/lib/exercises/math/geometry/vectors/scalarProduct/alKashi/scalarProductAlKashiSideLength.d.ts.map +1 -1
  26. package/lib/exercises/math/geometry/vectors/scalarProduct/alKashi/scalarProductAlKashiSideLength.js +112 -46
  27. package/lib/exercises/math/geometry/vectors/scalarProduct/alg/scalarProductIdentities.js +1 -1
  28. package/lib/exercises/math/geometry/vectors/scalarProduct/alg/scalarProductInOrthonormalBasisIJ.d.ts.map +1 -1
  29. package/lib/exercises/math/geometry/vectors/scalarProduct/alg/scalarProductInOrthonormalBasisIJ.js +6 -0
  30. package/lib/exercises/math/geometry/vectors/scalarProduct/alg/scalarProductLamdbaULambdaV.d.ts.map +1 -1
  31. package/lib/exercises/math/geometry/vectors/scalarProduct/alg/scalarProductLamdbaULambdaV.js +60 -82
  32. package/lib/exercises/math/geometry/vectors/scalarProduct/angleFromScalarProduct.d.ts.map +1 -1
  33. package/lib/exercises/math/geometry/vectors/scalarProduct/angleFromScalarProduct.js +92 -6
  34. package/lib/exercises/math/geometry/vectors/scalarProduct/index.d.ts +6 -1
  35. package/lib/exercises/math/geometry/vectors/scalarProduct/index.d.ts.map +1 -1
  36. package/lib/exercises/math/geometry/vectors/scalarProduct/index.js +6 -1
  37. package/lib/exercises/math/geometry/vectors/scalarProduct/orth/scalarProductIsOrthogonalVecsBasisIJ.d.ts.map +1 -1
  38. package/lib/exercises/math/geometry/vectors/scalarProduct/orth/scalarProductIsOrthogonalVecsBasisIJ.js +6 -0
  39. package/lib/exercises/math/geometry/vectors/scalarProduct/orth/scalarProductIsOrthogonalVecsUsingCoords.js +1 -1
  40. package/lib/exercises/math/geometry/vectors/scalarProduct/orth/scalarProductIsPointOnCircle.d.ts.map +1 -1
  41. package/lib/exercises/math/geometry/vectors/scalarProduct/orth/scalarProductIsPointOnCircle.js +15 -5
  42. package/lib/exercises/math/geometry/vectors/scalarProduct/orth/scalarProductIsPointOnPerpendicularBisector.d.ts.map +1 -1
  43. package/lib/exercises/math/geometry/vectors/scalarProduct/orth/scalarProductIsPointOnPerpendicularBisector.js +18 -14
  44. package/lib/exercises/math/geometry/vectors/scalarProduct/orth/scalarProductIsRightTriangleUsingPointCoords.d.ts.map +1 -1
  45. package/lib/exercises/math/geometry/vectors/scalarProduct/orth/scalarProductIsRightTriangleUsingPointCoords.js +15 -5
  46. package/lib/exercises/math/geometry/vectors/scalarProduct/scalarProductComputeBH.d.ts.map +1 -1
  47. package/lib/exercises/math/geometry/vectors/scalarProduct/scalarProductComputeBH.js +38 -4
  48. package/lib/exercises/math/geometry/vectors/scalarProduct/scalarProductOfVectsOnGrid1.d.ts.map +1 -1
  49. package/lib/exercises/math/geometry/vectors/scalarProduct/scalarProductOfVectsOnGrid1.js +77 -26
  50. package/lib/exercises/math/geometry/vectors/scalarProduct/scalarProductParallelogramDiagonalPlus.d.ts.map +1 -1
  51. package/lib/exercises/math/geometry/vectors/scalarProduct/scalarProductParallelogramDiagonalPlus.js +6 -7
  52. package/lib/exercises/math/probaStat/basicProbas/calculateProbaFromProbaLaw.js +1 -1
  53. package/lib/exercises/math/probaStat/probaFromTableWithContext.d.ts.map +1 -1
  54. package/lib/exercises/math/probaStat/probaFromTableWithContext.js +3 -16
  55. package/lib/exercises/math/probaStat/randomVariable/calculateProbaFromVATableLaw.d.ts +11 -0
  56. package/lib/exercises/math/probaStat/randomVariable/calculateProbaFromVATableLaw.d.ts.map +1 -0
  57. package/lib/exercises/math/probaStat/randomVariable/calculateProbaFromVATableLaw.js +232 -0
  58. package/lib/exercises/math/probaStat/randomVariable/decideWhichGameIsLessRisky.d.ts +14 -0
  59. package/lib/exercises/math/probaStat/randomVariable/decideWhichGameIsLessRisky.d.ts.map +1 -0
  60. package/lib/exercises/math/probaStat/randomVariable/decideWhichGameIsLessRisky.js +167 -0
  61. package/lib/exercises/math/probaStat/randomVariable/findValueForFairRandomVariable.d.ts.map +1 -1
  62. package/lib/exercises/math/probaStat/randomVariable/findValueForFairRandomVariable.js +29 -56
  63. package/lib/exercises/math/probaStat/randomVariable/index.d.ts +8 -0
  64. package/lib/exercises/math/probaStat/randomVariable/index.d.ts.map +1 -1
  65. package/lib/exercises/math/probaStat/randomVariable/index.js +9 -0
  66. package/lib/exercises/math/probaStat/randomVariable/isTableProbabilityLaw.d.ts.map +1 -1
  67. package/lib/exercises/math/probaStat/randomVariable/isTableProbabilityLaw.js +6 -6
  68. package/lib/exercises/math/probaStat/randomVariable/randomVariableAverage.js +1 -1
  69. package/lib/exercises/math/probaStat/randomVariable/randomVariableFindMissingProbabilityInLaw.d.ts +9 -0
  70. package/lib/exercises/math/probaStat/randomVariable/randomVariableFindMissingProbabilityInLaw.d.ts.map +1 -0
  71. package/lib/exercises/math/probaStat/randomVariable/randomVariableFindMissingProbabilityInLaw.js +116 -0
  72. package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationAverage.d.ts +11 -0
  73. package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationAverage.d.ts.map +1 -0
  74. package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationAverage.js +112 -0
  75. package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationComputeProbability.d.ts +9 -0
  76. package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationComputeProbability.d.ts.map +1 -0
  77. package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationComputeProbability.js +176 -0
  78. package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationIsGameFavorable.d.ts +8 -0
  79. package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationIsGameFavorable.d.ts.map +1 -0
  80. package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationIsGameFavorable.js +94 -0
  81. package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationProbabilityLaw.d.ts +9 -0
  82. package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationProbabilityLaw.d.ts.map +1 -0
  83. package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationProbabilityLaw.js +162 -0
  84. package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationStandardDeviation.d.ts +8 -0
  85. package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationStandardDeviation.d.ts.map +1 -0
  86. package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationStandardDeviation.js +133 -0
  87. package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationValues.d.ts +8 -0
  88. package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationValues.d.ts.map +1 -0
  89. package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationValues.js +211 -0
  90. package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationVariance.d.ts +8 -0
  91. package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationVariance.d.ts.map +1 -0
  92. package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationVariance.js +113 -0
  93. package/lib/exercises/math/probaStat/randomVariable/randomVariableStandardDeviation.js +1 -1
  94. package/lib/exercises/math/probaStat/randomVariable/randomVariableVariance.js +1 -1
  95. package/lib/exercises/math/probaStat/randomVariable/utils/buildVAOfGivenAverage.d.ts +31 -0
  96. package/lib/exercises/math/probaStat/randomVariable/utils/buildVAOfGivenAverage.d.ts.map +1 -0
  97. package/lib/exercises/math/probaStat/randomVariable/utils/buildVAOfGivenAverage.js +192 -0
  98. package/lib/exercises/math/probaStat/randomVariable/utils/randomVariableSituations.d.ts +40 -11
  99. package/lib/exercises/math/probaStat/randomVariable/utils/randomVariableSituations.d.ts.map +1 -1
  100. package/lib/exercises/math/probaStat/randomVariable/utils/randomVariableSituations.js +172 -30
  101. package/lib/exercises/math/probaStat/stats1var/medianWithList.d.ts.map +1 -1
  102. package/lib/exercises/math/probaStat/stats1var/medianWithList.js +16 -2
  103. package/lib/exercises/math/sequences/arithmetic/arithmeticVariations.js +1 -1
  104. package/lib/exercises/math/trigonometry/circle/placeAssociateAngleOnCircle.d.ts.map +1 -1
  105. package/lib/exercises/math/trigonometry/circle/placeAssociateAngleOnCircle.js +0 -2
  106. package/lib/exercises/vea/rationalVEA.d.ts.map +1 -1
  107. package/lib/exercises/vea/rationalVEA.js +7 -3
  108. package/lib/exercises/vea/varLineVEA.d.ts.map +1 -1
  109. package/lib/exercises/vea/varLineVEA.js +2 -1
  110. package/lib/exercises/vea/varSignTableVEA.d.ts +8 -0
  111. package/lib/exercises/vea/varSignTableVEA.d.ts.map +1 -1
  112. package/lib/exercises/vea/varSignTableVEA.js +8 -0
  113. package/lib/exercises/vea/xTableLineVEA.d.ts +1 -0
  114. package/lib/exercises/vea/xTableLineVEA.d.ts.map +1 -1
  115. package/lib/exercises/vea/xTableLineVEA.js +1 -0
  116. package/lib/index.d.ts +86 -3
  117. package/lib/index.d.ts.map +1 -1
  118. package/lib/latexTester.d.ts.map +1 -1
  119. package/lib/latexTester.js +3 -1
  120. package/lib/math/geometry/angle.d.ts +2 -0
  121. package/lib/math/geometry/angle.d.ts.map +1 -1
  122. package/lib/math/geometry/angle.js +17 -0
  123. package/lib/math/geometry/point.js +2 -2
  124. package/lib/math/geometry/segment.js +1 -1
  125. package/lib/math/numbers/reals/real.d.ts.map +1 -1
  126. package/lib/math/numbers/reals/real.js +4 -0
  127. package/lib/math/probability/randomVariable.d.ts +2 -1
  128. package/lib/math/probability/randomVariable.d.ts.map +1 -1
  129. package/lib/math/probability/randomVariable.js +7 -1
  130. package/lib/math/utils/arithmetic/primeFactors.d.ts +1 -1
  131. package/lib/math/utils/arithmetic/primeFactors.d.ts.map +1 -1
  132. package/lib/math/utils/arithmetic/primeFactors.js +23 -9
  133. package/lib/math/utils/random/randTupleInt.d.ts +1 -0
  134. package/lib/math/utils/random/randTupleInt.d.ts.map +1 -1
  135. package/lib/math/utils/random/randTupleInt.js +3 -0
  136. package/lib/tests/exosTest.d.ts.map +1 -1
  137. package/lib/tests/exosTest.js +2 -0
  138. package/lib/tests/pdfs/mdTableToLatexTabular.js +1 -1
  139. package/lib/tree/nodes/algebraicNode.d.ts +1 -0
  140. package/lib/tree/nodes/algebraicNode.d.ts.map +1 -1
  141. package/lib/tree/nodes/complex/complexNode.d.ts +1 -0
  142. package/lib/tree/nodes/complex/complexNode.d.ts.map +1 -1
  143. package/lib/tree/nodes/complex/complexNode.js +3 -0
  144. package/lib/tree/nodes/equations/equalNode.d.ts +1 -0
  145. package/lib/tree/nodes/equations/equalNode.d.ts.map +1 -1
  146. package/lib/tree/nodes/equations/equalNode.js +3 -0
  147. package/lib/tree/nodes/equations/equationSolutionNode.d.ts +1 -0
  148. package/lib/tree/nodes/equations/equationSolutionNode.d.ts.map +1 -1
  149. package/lib/tree/nodes/equations/equationSolutionNode.js +3 -0
  150. package/lib/tree/nodes/equations/multiEqualNode.d.ts +1 -0
  151. package/lib/tree/nodes/equations/multiEqualNode.d.ts.map +1 -1
  152. package/lib/tree/nodes/equations/multiEqualNode.js +3 -0
  153. package/lib/tree/nodes/equations/notEqualNode.d.ts +1 -0
  154. package/lib/tree/nodes/equations/notEqualNode.d.ts.map +1 -1
  155. package/lib/tree/nodes/equations/notEqualNode.js +3 -0
  156. package/lib/tree/nodes/functions/absNode.d.ts +1 -0
  157. package/lib/tree/nodes/functions/absNode.d.ts.map +1 -1
  158. package/lib/tree/nodes/functions/absNode.js +7 -0
  159. package/lib/tree/nodes/functions/arcSinNode.d.ts +1 -0
  160. package/lib/tree/nodes/functions/arcSinNode.d.ts.map +1 -1
  161. package/lib/tree/nodes/functions/arcSinNode.js +7 -0
  162. package/lib/tree/nodes/functions/arccosNode.d.ts +1 -0
  163. package/lib/tree/nodes/functions/arccosNode.d.ts.map +1 -1
  164. package/lib/tree/nodes/functions/arccosNode.js +7 -0
  165. package/lib/tree/nodes/functions/arctanNode.d.ts +1 -0
  166. package/lib/tree/nodes/functions/arctanNode.d.ts.map +1 -1
  167. package/lib/tree/nodes/functions/arctanNode.js +7 -0
  168. package/lib/tree/nodes/functions/cosNode.d.ts +1 -0
  169. package/lib/tree/nodes/functions/cosNode.d.ts.map +1 -1
  170. package/lib/tree/nodes/functions/cosNode.js +7 -0
  171. package/lib/tree/nodes/functions/expNode.d.ts +1 -0
  172. package/lib/tree/nodes/functions/expNode.d.ts.map +1 -1
  173. package/lib/tree/nodes/functions/expNode.js +7 -0
  174. package/lib/tree/nodes/functions/factorialNode.d.ts +30 -0
  175. package/lib/tree/nodes/functions/factorialNode.d.ts.map +1 -0
  176. package/lib/tree/nodes/functions/factorialNode.js +79 -0
  177. package/lib/tree/nodes/functions/functionNode.d.ts +2 -1
  178. package/lib/tree/nodes/functions/functionNode.d.ts.map +1 -1
  179. package/lib/tree/nodes/functions/functionNode.js +1 -0
  180. package/lib/tree/nodes/functions/integralNode.d.ts +1 -0
  181. package/lib/tree/nodes/functions/integralNode.d.ts.map +1 -1
  182. package/lib/tree/nodes/functions/integralNode.js +7 -0
  183. package/lib/tree/nodes/functions/log10Node.d.ts +1 -0
  184. package/lib/tree/nodes/functions/log10Node.d.ts.map +1 -1
  185. package/lib/tree/nodes/functions/log10Node.js +7 -0
  186. package/lib/tree/nodes/functions/logNode.d.ts +1 -0
  187. package/lib/tree/nodes/functions/logNode.d.ts.map +1 -1
  188. package/lib/tree/nodes/functions/logNode.js +9 -0
  189. package/lib/tree/nodes/functions/oppositeNode.d.ts +1 -0
  190. package/lib/tree/nodes/functions/oppositeNode.d.ts.map +1 -1
  191. package/lib/tree/nodes/functions/oppositeNode.js +7 -0
  192. package/lib/tree/nodes/functions/sinNode.d.ts +1 -0
  193. package/lib/tree/nodes/functions/sinNode.d.ts.map +1 -1
  194. package/lib/tree/nodes/functions/sinNode.js +7 -0
  195. package/lib/tree/nodes/functions/sqrtNode.d.ts +1 -0
  196. package/lib/tree/nodes/functions/sqrtNode.d.ts.map +1 -1
  197. package/lib/tree/nodes/functions/sqrtNode.js +7 -0
  198. package/lib/tree/nodes/functions/tanNode.d.ts +1 -0
  199. package/lib/tree/nodes/functions/tanNode.d.ts.map +1 -1
  200. package/lib/tree/nodes/functions/tanNode.js +7 -0
  201. package/lib/tree/nodes/geometry/degree.d.ts +1 -0
  202. package/lib/tree/nodes/geometry/degree.d.ts.map +1 -1
  203. package/lib/tree/nodes/geometry/degree.js +7 -0
  204. package/lib/tree/nodes/geometry/lengthNode.d.ts +1 -0
  205. package/lib/tree/nodes/geometry/lengthNode.d.ts.map +1 -1
  206. package/lib/tree/nodes/geometry/lengthNode.js +7 -0
  207. package/lib/tree/nodes/geometry/pointNode.d.ts +1 -0
  208. package/lib/tree/nodes/geometry/pointNode.d.ts.map +1 -1
  209. package/lib/tree/nodes/geometry/pointNode.js +7 -0
  210. package/lib/tree/nodes/geometry/vectorNode.d.ts +1 -0
  211. package/lib/tree/nodes/geometry/vectorNode.d.ts.map +1 -1
  212. package/lib/tree/nodes/geometry/vectorNode.js +7 -0
  213. package/lib/tree/nodes/inequations/inequationNode.d.ts +1 -0
  214. package/lib/tree/nodes/inequations/inequationNode.d.ts.map +1 -1
  215. package/lib/tree/nodes/inequations/inequationNode.js +7 -0
  216. package/lib/tree/nodes/inequations/inequationSolutionNode.d.ts +1 -0
  217. package/lib/tree/nodes/inequations/inequationSolutionNode.d.ts.map +1 -1
  218. package/lib/tree/nodes/inequations/inequationSolutionNode.js +7 -0
  219. package/lib/tree/nodes/node.d.ts +2 -1
  220. package/lib/tree/nodes/node.d.ts.map +1 -1
  221. package/lib/tree/nodes/node.js +2 -0
  222. package/lib/tree/nodes/nodeConstructor.d.ts.map +1 -1
  223. package/lib/tree/nodes/nodeConstructor.js +4 -0
  224. package/lib/tree/nodes/numbers/percentNode.d.ts +1 -0
  225. package/lib/tree/nodes/numbers/percentNode.d.ts.map +1 -1
  226. package/lib/tree/nodes/numbers/percentNode.js +7 -0
  227. package/lib/tree/nodes/operators/addNode.d.ts +1 -0
  228. package/lib/tree/nodes/operators/addNode.d.ts.map +1 -1
  229. package/lib/tree/nodes/operators/addNode.js +7 -0
  230. package/lib/tree/nodes/operators/binomialCoefficientNode.d.ts +2 -1
  231. package/lib/tree/nodes/operators/binomialCoefficientNode.d.ts.map +1 -1
  232. package/lib/tree/nodes/operators/binomialCoefficientNode.js +18 -2
  233. package/lib/tree/nodes/operators/divideNode.d.ts +1 -0
  234. package/lib/tree/nodes/operators/divideNode.d.ts.map +1 -1
  235. package/lib/tree/nodes/operators/divideNode.js +7 -0
  236. package/lib/tree/nodes/operators/fractionNode.d.ts +1 -0
  237. package/lib/tree/nodes/operators/fractionNode.d.ts.map +1 -1
  238. package/lib/tree/nodes/operators/fractionNode.js +7 -0
  239. package/lib/tree/nodes/operators/limitNode.d.ts +1 -0
  240. package/lib/tree/nodes/operators/limitNode.d.ts.map +1 -1
  241. package/lib/tree/nodes/operators/limitNode.js +7 -0
  242. package/lib/tree/nodes/operators/multiplyNode.d.ts +1 -0
  243. package/lib/tree/nodes/operators/multiplyNode.d.ts.map +1 -1
  244. package/lib/tree/nodes/operators/multiplyNode.js +7 -0
  245. package/lib/tree/nodes/operators/powerNode.d.ts +1 -0
  246. package/lib/tree/nodes/operators/powerNode.d.ts.map +1 -1
  247. package/lib/tree/nodes/operators/powerNode.js +7 -0
  248. package/lib/tree/nodes/operators/substractNode.d.ts +1 -0
  249. package/lib/tree/nodes/operators/substractNode.d.ts.map +1 -1
  250. package/lib/tree/nodes/operators/substractNode.js +7 -0
  251. package/lib/tree/nodes/polynomials/monomNode.d.ts +1 -0
  252. package/lib/tree/nodes/polynomials/monomNode.d.ts.map +1 -1
  253. package/lib/tree/nodes/polynomials/monomNode.js +7 -0
  254. package/lib/tree/nodes/polynomials/trinomNode.d.ts +1 -0
  255. package/lib/tree/nodes/polynomials/trinomNode.d.ts.map +1 -1
  256. package/lib/tree/nodes/polynomials/trinomNode.js +7 -0
  257. package/lib/tree/nodes/sets/belongsNode.d.ts +1 -0
  258. package/lib/tree/nodes/sets/belongsNode.d.ts.map +1 -1
  259. package/lib/tree/nodes/sets/belongsNode.js +7 -0
  260. package/lib/tree/nodes/sets/discreteSetNode.d.ts +1 -0
  261. package/lib/tree/nodes/sets/discreteSetNode.d.ts.map +1 -1
  262. package/lib/tree/nodes/sets/discreteSetNode.js +7 -0
  263. package/lib/tree/nodes/sets/intervalNode.d.ts +1 -0
  264. package/lib/tree/nodes/sets/intervalNode.d.ts.map +1 -1
  265. package/lib/tree/nodes/sets/intervalNode.js +7 -0
  266. package/lib/tree/nodes/sets/unionIntervalNode.d.ts +1 -0
  267. package/lib/tree/nodes/sets/unionIntervalNode.d.ts.map +1 -1
  268. package/lib/tree/nodes/sets/unionIntervalNode.js +7 -0
  269. package/lib/tree/nodes/variables/variableNode.d.ts +1 -0
  270. package/lib/tree/nodes/variables/variableNode.d.ts.map +1 -1
  271. package/lib/tree/nodes/variables/variableNode.js +7 -0
  272. package/lib/tree/utilities/nodeShuffler.d.ts.map +1 -1
  273. package/lib/tree/utilities/nodeShuffler.js +3 -0
  274. package/lib/tree/utilities/nodeSimplifier.d.ts.map +1 -1
  275. package/lib/tree/utilities/nodeSimplifier.js +3 -0
  276. package/package.json +1 -1
@@ -1,6 +1,5 @@
1
1
  import { addValidProp, shuffleProps, tryToAddWrongProp, propWhile, } from "../../../../../../exercises/exercise.js";
2
2
  import { getDistinctQuestions } from "../../../../../../exercises/utils/getDistinctQuestions.js";
3
- import { GeogebraConstructor } from "../../../../../../geogebra/geogebraConstructor.js";
4
3
  import { TriangleConstructor, } from "../../../../../../math/geometry/triangles/triangle.js";
5
4
  import { randfloat } from "../../../../../../math/utils/random/randfloat.js";
6
5
  import { randint } from "../../../../../../math/utils/random/randint.js";
@@ -16,7 +15,12 @@ import { parseAlgebraic } from "../../../../../../tree/parsers/latexParser.js";
16
15
  import { probaFlip } from "../../../../../../utils/alea/probaFlip.js";
17
16
  import { arrayRotation } from "../../../../../../utils/arrays/rotation.js";
18
17
  import { handleVEAError } from "../../../../../../utils/errors/handleVEAError.js";
18
+ import { alignTex } from "../../../../../../utils/latex/alignTex.js";
19
19
  const precision = 2;
20
+ const strForKeyIdDegree = "^\\circ";
21
+ const texWithDegreesUnit = (strUnitless) => {
22
+ return `${strUnitless}${strForKeyIdDegree}`;
23
+ };
20
24
  const getHydrated = (identifiers) => {
21
25
  const { triangleIds, indexAngle } = identifiers;
22
26
  const triangle = TriangleConstructor.fromIdentifiers(triangleIds);
@@ -35,33 +39,30 @@ const getInstruction = (identifiers) => {
35
39
 
36
40
  ${triangle.sides.map((segment) => `- $${segment.toInsideName()} = ${segment.getLength().frenchify()}$`).join(`
37
41
 
38
- `)}
39
-
40
- Combien l'angle $${triangle.angles[indexAngle].toTexMini()}$ mesure-t-il ?
41
- Donner une valeur approchée en degrés avec $${precision}$ décimales.`;
42
+ `)}
43
+
44
+ Donner une mesure en degrés (arrondie à deux décimales) de langle $${triangle.angles[indexAngle].toTexMini()}$.`;
42
45
  };
43
46
  const getAnswerStuff = (identifiers) => {
44
47
  const { sides } = getHydrated(identifiers);
45
48
  const nodeCosAngle = frac(substract(add(power(sides[1].getLengthNode(), 2), power(sides[2].getLengthNode(), 2)), power(sides[0].getLengthNode(), 2)), multiply(2, multiply(sides[1].getLengthNode(), sides[2].getLengthNode())));
46
49
  const nodeAngleInRadians = arccos(nodeCosAngle);
47
50
  const nodeAngleInDegrees = multiply(nodeAngleInRadians, frac(180, PiNode));
51
+ const angleInDegreesRounded = round(nodeAngleInDegrees.evaluate(), precision);
48
52
  return {
49
53
  nodeCosAngle,
50
54
  nodeAngleInRadians,
51
55
  nodeAngleInDegrees,
56
+ angleInDegreesRounded,
52
57
  };
53
58
  };
54
59
  const getAnswerNode = (identifiers) => {
55
- return getAnswerStuff(identifiers).nodeAngleInDegrees;
60
+ return getAnswerStuff(identifiers).angleInDegreesRounded.toTree();
56
61
  };
57
62
  const getAnswer = (identifiers) => {
58
- return round(getAnswerNode(identifiers).evaluate(), precision).frenchify();
63
+ return texWithDegreesUnit(getAnswerNode(identifiers).toTex());
59
64
  };
60
65
  const getHint = (identifiers) => {
61
- const { angleNames } = getHydrated(identifiers);
62
- return `Applique le théorème d'Al Kashi dans le triangle $ABC$ pour l'angle $${angleNames[0]}$.`;
63
- };
64
- const getCorrection = (identifiers) => {
65
66
  const { indexAngle } = identifiers;
66
67
  const { sides, angleNames } = getHydrated(identifiers);
67
68
  const sideNames = arrayRotation(sides, indexAngle)
@@ -73,66 +74,65 @@ const getCorrection = (identifiers) => {
73
74
  BC: "a",
74
75
  }[name];
75
76
  });
76
- const nodeCosAngle = frac(substract(add(power(sideNames[1], 2), power(sideNames[2], 2)), power(sideNames[0], 2)), multiply(2, multiply(sideNames[1], sideNames[2])));
77
- const nodeAngle = arccos(nodeCosAngle);
78
- return `On applique le théorème d'Al Kashi dans le triangle $ABC$.
77
+ return `Applique le théorème d'Al-Kashi dans le triangle $ABC$ pour l'angle $${angleNames[0]}$.
78
+
79
+ Rappel:
79
80
 
80
- On utilise les notations suivantes :
81
+ Si on utilise les notations suivantes :
81
82
 
82
83
  $$
83
84
  a \\ = \\ BC \\ ; \\ b \\ = \\ AC \\ ; \\ c \\ = \\ AB \\
84
85
  $$
85
86
 
87
+ le théorème d'Al-Kashi s'écrit :
88
+
86
89
  $$
87
90
  ${sideNames[0]}^2 = ${sideNames[1]}^2 + ${sideNames[2]}^2 - 2 ${sideNames[1]} ${sideNames[2]} \\cos(${angleNames[0]})
88
- $$
91
+ $$`;
92
+ };
93
+ const getCorrection = (identifiers) => {
94
+ const { indexAngle } = identifiers;
95
+ const { sides, angleNames } = getHydrated(identifiers);
96
+ const sideNames = arrayRotation(sides, indexAngle)
97
+ .map((segment) => segment.toInsideName())
98
+ .map((name) => {
99
+ return {
100
+ AB: "c",
101
+ AC: "b",
102
+ BC: "a",
103
+ }[name];
104
+ });
105
+ const nodeCosAngleWithVars = frac(substract(add(power(sideNames[1], 2), power(sideNames[2], 2)), power(sideNames[0], 2)), multiply(2, multiply(sideNames[1], sideNames[2])));
106
+ const nodeCosAngleWithValues = getAnswerStuff(identifiers).nodeCosAngle;
107
+ return `On applique le théorème d'Al-Kashi dans le triangle $ABC$.
108
+
109
+ On utilise les notations suivantes :
89
110
 
90
111
  $$
91
- \\cos(${angleNames[0]}) = ${nodeCosAngle.toTex()}
112
+ a \\ = \\ BC \\ ; \\ b \\ = \\ AC \\ ; \\ c \\ = \\ AB \\
92
113
  $$
93
114
 
94
- En radians :
115
+ Avec ces notations, d'après le théorème d'Al-Kashi :
95
116
 
96
117
  $$
97
- ${angleNames[0]} = ${nodeAngle.toTex()}
118
+ ${sideNames[0]}^2 = ${sideNames[1]}^2 + ${sideNames[2]}^2 - 2 ${sideNames[1]} ${sideNames[2]} \\cos(${angleNames[0]})
98
119
  $$
99
120
 
100
- Il ne faut pas oublier de passer en degrés :
121
+ On a donc
101
122
 
102
- $$
103
- ${angleNames[0]}_{deg} = ${angleNames[0]}_{rad} \\times \\frac{180}{${PiNode.toTex()}}
104
- $$
123
+ ${alignTex([
124
+ [`\\cos(${angleNames[0]})`, "=", `${nodeCosAngleWithVars.toTex()}`],
125
+ ["", "=", `${nodeCosAngleWithValues.toTex()}`],
126
+ ])}
105
127
 
106
- On arrondit à la toute fin :
128
+ À l’aide de la calculatrice réglée en degrés, on calcule alors $\\cos^{-1}$ et, comme d'habitude, on arrondit à la toute fin :
107
129
 
108
130
  $$
109
- ${angleNames[0]} \\approx ${getAnswer(identifiers)} {}^{\\circ}
131
+ ${angleNames[0]} \\approx ${getAnswer(identifiers)}
110
132
  $$
111
133
 
112
134
  `;
113
135
  };
114
- //too helpful for student ?
115
- const getGGBOptions = (identifiers) => {
116
- const { triangle } = getHydrated(identifiers);
117
- // const { indexAngle } = identifiers;
118
- // const angle = arrayRotation(triangle.angles, indexAngle)[0];
119
- const ggb = new GeogebraConstructor({
120
- commands: [
121
- //triangle
122
- ...triangle.commands,
123
- // //angle
124
- // `Ang = Angle(${angle.points
125
- // .reverse()
126
- // .map((point) => point.name)
127
- // .join(",")})`,
128
- // `ShowLabel(Ang, false)`,
129
- ],
130
- hideAxes: true,
131
- });
132
- return ggb.getOptions({
133
- coords: ggb.getCoordsForPoints(triangle.points),
134
- });
135
- };
136
136
  const getPropositions = (n, { answer, ...identifiers }) => {
137
137
  const propositions = [];
138
138
  addValidProp(propositions, answer);
@@ -143,19 +143,19 @@ const getPropositions = (n, { answer, ...identifiers }) => {
143
143
  {
144
144
  const valueCos = answerStuff.nodeCosAngle.evaluate();
145
145
  if (valueCos > 0) {
146
- tryToAddWrongProp(propositions, round(valueCos, precision).frenchify());
146
+ tryToAddWrongProp(propositions, texWithDegreesUnit(round(valueCos, precision).frenchify()));
147
147
  }
148
148
  }
149
149
  //student: radians instead of degrees
150
150
  {
151
- tryToAddWrongProp(propositions, round(answerStuff.nodeAngleInRadians.evaluate(), precision).frenchify());
151
+ tryToAddWrongProp(propositions, texWithDegreesUnit(round(answerStuff.nodeAngleInRadians.evaluate(), precision).frenchify()));
152
152
  }
153
153
  //student: sign error when getting cos
154
154
  {
155
155
  const nodeCosAngle = frac(substract(add(power(sides[1].getLengthNode(), 2), power(sides[2].getLengthNode(), 2)), power(sides[0].getLengthNode(), 2)), multiply(-2, multiply(sides[1].getLengthNode(), sides[2].getLengthNode())));
156
156
  const nodeAngleInRadians = arccos(nodeCosAngle);
157
157
  const nodeAngleInDegrees = multiply(nodeAngleInRadians, frac(180, PiNode));
158
- tryToAddWrongProp(propositions, round(nodeAngleInDegrees.evaluate(), precision).frenchify());
158
+ tryToAddWrongProp(propositions, texWithDegreesUnit(round(nodeAngleInDegrees.evaluate(), precision).frenchify()));
159
159
  }
160
160
  //student: wrong angle
161
161
  {
@@ -180,26 +180,32 @@ const getPropositions = (n, { answer, ...identifiers }) => {
180
180
  const identifiersWrong = Object.assign({}, identifiers, {
181
181
  indexAngle: indexAngleWrong,
182
182
  });
183
- return getAnswerNode(identifiersWrong).evaluate();
183
+ return getAnswerStuff(identifiersWrong).nodeAngleInDegrees.evaluate();
184
184
  }
185
185
  })();
186
186
  [...Array(4).keys()].forEach(() => {
187
187
  const valueAnswerOffsetted = value + randfloat(-7, 7, 2, [0]);
188
- tryToAddWrongProp(propositions, round(valueAnswerOffsetted, precision).frenchify());
188
+ tryToAddWrongProp(propositions, texWithDegreesUnit(round(valueAnswerOffsetted, precision).frenchify()));
189
189
  });
190
190
  }
191
191
  propWhile(propositions, n, () => {
192
- tryToAddWrongProp(propositions, randfloat(0, 180, 2, [0, 180]).frenchify());
192
+ tryToAddWrongProp(propositions, texWithDegreesUnit(randfloat(0, 180, 2, [0, 180]).frenchify()));
193
193
  });
194
194
  return shuffleProps(propositions, n);
195
195
  };
196
196
  const getKeys = () => {
197
- return [];
197
+ return ["degree"];
198
198
  };
199
- const isAnswerValid = (ans, { answer }) => {
199
+ const isAnswerValid = (ans, { answer, ...identifiers }) => {
200
+ const strForKeyIdDegreeReceivedFromTests = "^\\circ";
201
+ const strForKeyIdDegreeReceivedFromFront = "^{\\circ}"; //different from strForKeyIdDegreeSent: "^\\circ"
202
+ const ansRefined = ans
203
+ .replace(strForKeyIdDegreeReceivedFromTests, "")
204
+ .replace(strForKeyIdDegreeReceivedFromFront, "");
200
205
  try {
201
- const parsed = parseAlgebraic(ans);
202
- return parsed.simplify().toTex() === answer;
206
+ const nodeAns = parseAlgebraic(ansRefined);
207
+ const nodeAnswer = getAnswerNode(identifiers);
208
+ return substract(nodeAns, nodeAnswer).evaluate() === 0;
203
209
  }
204
210
  catch (err) {
205
211
  return handleVEAError(err);
@@ -223,13 +229,12 @@ const getQuestionFromIdentifiers = (identifiers) => {
223
229
  identifiers,
224
230
  hint: getHint(identifiers),
225
231
  correction: getCorrection(identifiers),
226
- ggbOptions: getGGBOptions(identifiers),
227
232
  };
228
233
  };
229
234
  export const scalarProductAlKashiAngle = {
230
235
  id: "scalarProductAlKashiAngle",
231
236
  connector: "=",
232
- label: "Connaissant les longueurs des trois côtés d'un triangle, calculer un angle",
237
+ label: "Connaissant les longueurs des trois côtés d'un triangle, calculer un angle grâce au théorème d’Al-Kashi",
233
238
  isSingleStep: true,
234
239
  generator: (nb, opts) => getDistinctQuestions(() => getScalarProductAlKashiAngleQuestion(opts), nb),
235
240
  qcmTimer: 60,
@@ -243,5 +248,4 @@ export const scalarProductAlKashiAngle = {
243
248
  hasHintAndCorrection: true,
244
249
  getAnswer,
245
250
  getQuestionFromIdentifiers,
246
- hasGeogebra: true,
247
251
  };
@@ -2,6 +2,7 @@ import { Exercise } from "../../../../../../exercises/exercise.js";
2
2
  import { PointIdentifiers } from "../../../../../../math/geometry/point.js";
3
3
  import { TriangleIdentifiers } from "../../../../../../math/geometry/triangles/triangle.js";
4
4
  type Identifiers = {
5
+ sectorOfPointH: string;
5
6
  triangleIds: TriangleIdentifiers;
6
7
  pointIdsH: PointIdentifiers;
7
8
  };
@@ -1 +1 @@
1
- {"version":3,"file":"scalarProductAlKashiBH.d.ts","sourceRoot":"","sources":["../../../../../../../src/exercises/math/geometry/vectors/scalarProduct/alKashi/scalarProductAlKashiBH.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAmBT,MAAM,6BAA6B,CAAC;AAKrC,OAAO,EAGL,gBAAgB,EACjB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAGL,mBAAmB,EACpB,MAAM,2CAA2C,CAAC;AAsBnD,KAAK,WAAW,GAAG;IACjB,WAAW,EAAE,mBAAmB,CAAC;IACjC,SAAS,EAAE,gBAAgB,CAAC;CAC7B,CAAC;AAggBF,KAAK,OAAO,GAAG;IACb,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAsBF,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,WAAW,EAAE,OAAO,CA2BjE,CAAC"}
1
+ {"version":3,"file":"scalarProductAlKashiBH.d.ts","sourceRoot":"","sources":["../../../../../../../src/exercises/math/geometry/vectors/scalarProduct/alKashi/scalarProductAlKashiBH.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAmBT,MAAM,6BAA6B,CAAC;AAKrC,OAAO,EAGL,gBAAgB,EACjB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAGL,mBAAmB,EACpB,MAAM,2CAA2C,CAAC;AAwBnD,KAAK,WAAW,GAAG;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,mBAAmB,CAAC;IACjC,SAAS,EAAE,gBAAgB,CAAC;CAC7B,CAAC;AAopBF,KAAK,OAAO,GAAG;IACb,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAuBF,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,WAAW,EAAE,OAAO,CA2BjE,CAAC"}
@@ -9,6 +9,7 @@ import { Segment } from "../../../../../../math/geometry/segment.js";
9
9
  import { Triangle, TriangleConstructor, } from "../../../../../../math/geometry/triangles/triangle.js";
10
10
  import { VectorConstructor } from "../../../../../../math/geometry/vector.js";
11
11
  import { randfloat } from "../../../../../../math/utils/random/randfloat.js";
12
+ import { randint } from "../../../../../../math/utils/random/randint.js";
12
13
  import { round } from "../../../../../../math/utils/round.js";
13
14
  import { abs } from "../../../../../../tree/nodes/functions/absNode.js";
14
15
  import { arccos } from "../../../../../../tree/nodes/functions/arccosNode.js";
@@ -20,8 +21,9 @@ import { multiply } from "../../../../../../tree/nodes/operators/multiplyNode.js
20
21
  import { power } from "../../../../../../tree/nodes/operators/powerNode.js";
21
22
  import { substract } from "../../../../../../tree/nodes/operators/substractNode.js";
22
23
  import { parseAlgebraic } from "../../../../../../tree/parsers/latexParser.js";
23
- import { probaFlip } from "../../../../../../utils/alea/probaFlip.js";
24
+ import { probaLawFlip } from "../../../../../../utils/alea/probaLawFlip.js";
24
25
  import { random } from "../../../../../../utils/alea/random.js";
26
+ import { shuffle } from "../../../../../../utils/alea/shuffle.js";
25
27
  import { zip } from "../../../../../../utils/arrays/arrayZip.js";
26
28
  import { arrayRotation } from "../../../../../../utils/arrays/rotation.js";
27
29
  import { handleVEAError } from "../../../../../../utils/errors/handleVEAError.js";
@@ -43,21 +45,48 @@ const getHydrated = (identifiers) => {
43
45
  };
44
46
  };
45
47
  const getInstruction = (identifiers) => {
48
+ const { sectorOfPointH } = identifiers;
46
49
  const { triangle, sides, sideLengths } = getHydrated(identifiers);
47
50
  return `Soit $${triangle.name}$ un triangle dont on connaît les longueurs des côtés :
48
51
 
49
52
  ${zip(sides, sideLengths).map(([segment, valueLength]) => `- $${segment.toInsideName()} = ${valueLength.frenchify()}$`).join(`
50
53
 
51
- `)}
54
+ `)}
52
55
 
53
- Combien le segment $BH$ mesure-t-il ?
54
- Donner une valeur approchée en degrés avec $${precision}$ décimales.`;
56
+ $H$ est le pied de la hauteur issue de $A$.
57
+
58
+ ${(() => {
59
+ switch (sectorOfPointH) {
60
+ case "Entre $B$ et $C$":
61
+ return `On précise que $H$ appartient au segment $[BC]$.`;
62
+ case "Après $C$":
63
+ return `On précise que $H$ n'appartient pas au segment $[BC]$. $H$ est plus proche de $C$ que de $B$.`;
64
+ case "Avant $B$":
65
+ return `On précise que $H$ n'appartient pas au segment $[BC]$. $H$ est plus proche de $B$ que de $C$.`;
66
+ default:
67
+ throw new Error("Unsupported opts.sectorOfPointH: " + sectorOfPointH);
68
+ }
69
+ })()}
70
+
71
+ Calculer la longueur $BH$ (donner une valeur arrondie à $${precision}$ décimales).`;
55
72
  };
56
73
  const getAnswerStuff = (identifiers) => {
74
+ const { sectorOfPointH } = identifiers;
57
75
  const { sideLengths } = getHydrated(identifiers);
58
76
  const nodeCosAngle = frac(substract(add(power(sideLengths[1], 2), power(sideLengths[2], 2)), power(sideLengths[0], 2)), multiply(2, multiply(sideLengths[1], sideLengths[2])));
59
77
  const nodeLengthBA = sideLengths[1];
60
- const nodeLengthBH = multiply(nodeLengthBA, abs(nodeCosAngle));
78
+ const sign = (() => {
79
+ switch (sectorOfPointH) {
80
+ case "Entre $B$ et $C$":
81
+ case "Après $C$":
82
+ return +1;
83
+ case "Avant $B$":
84
+ return -1;
85
+ default:
86
+ throw new Error("Unsupported opts.sectorOfPointH: " + sectorOfPointH);
87
+ }
88
+ })();
89
+ const nodeLengthBH = multiply(sign, multiply(nodeLengthBA, nodeCosAngle));
61
90
  return {
62
91
  nodeCosAngle,
63
92
  nodeLengthBH,
@@ -69,12 +98,41 @@ const getAnswerNode = (identifiers) => {
69
98
  const getAnswer = (identifiers) => {
70
99
  return round(getAnswerNode(identifiers).evaluate(), precision).frenchify();
71
100
  };
72
- const getHint = () => {
73
- return `Applique le théorème d'Al Kashi dans le triangle $ABC$ pour l'angle $\\widehat{B}$.
101
+ const getHint = (identifiers) => {
102
+ const { sides, angleNames } = getHydrated(identifiers);
103
+ const sideNames = sides
104
+ .map((segment) => segment.toInsideName())
105
+ .map((name) => {
106
+ return {
107
+ AB: "c",
108
+ AC: "b",
109
+ BC: "a",
110
+ }[name];
111
+ });
112
+ return `Premièrement, puisque $H$ est le projeté orthogonal de $A$ sur $(BC)$, tu peux écrire :
113
+
114
+ $$
115
+ \\overrightarrow{BA} \\cdot \\overrightarrow{BC} = \\overrightarrow{BH} \\cdot \\overrightarrow{BC}
116
+ $$
74
117
 
75
- Ensuite, calcule $\\overrightarrow{BA} \\cdot \\overrightarrow{BC}$ de deux manières différentes.`;
118
+ Deuxièmement, applique le théorème d'Al-Kashi dans le triangle $ABC$.
119
+
120
+ Rappel:
121
+
122
+ Si on utilise les notations suivantes :
123
+
124
+ $$
125
+ a \\ = \\ BC \\ ; \\ b \\ = \\ AC \\ ; \\ c \\ = \\ AB \\
126
+ $$
127
+
128
+ le théorème d'Al-Kashi s'écrit :
129
+
130
+ $$
131
+ ${sideNames[0]}^2 = ${sideNames[1]}^2 + ${sideNames[2]}^2 - 2 ${sideNames[1]} ${sideNames[2]} \\cos(${angleNames[0]})
132
+ $$`;
76
133
  };
77
134
  const getCorrection = (identifiers) => {
135
+ const { sectorOfPointH } = identifiers;
78
136
  const { sides, angleNames } = getHydrated(identifiers);
79
137
  const sideNames = sides
80
138
  .map((segment) => segment.toInsideName())
@@ -87,40 +145,94 @@ const getCorrection = (identifiers) => {
87
145
  });
88
146
  const nodeCosAngle = frac(substract(add(power(sideNames[1], 2), power(sideNames[2], 2)), power(sideNames[0], 2)), multiply(2, multiply(sideNames[1], sideNames[2])));
89
147
  const { nodeLengthBH } = getAnswerStuff(identifiers);
90
- return `On applique le théorème d'Al Kashi dans le triangle $ABC$.
148
+ return `D'une part, par définition du produit scalaire :
91
149
 
92
- On utilise les notations suivantes :
150
+ $$
151
+ \\overrightarrow{BA} \\cdot \\overrightarrow{BC} = BA \\times BC \\times \\cos(${angleNames[0]})
152
+ $$
153
+
154
+ D'autre part, puisque $H$ est le projeté orthogonal de $A$ sur $(BC)$, on a :
93
155
 
94
156
  $$
95
- a \\ = \\ BC \\ ; \\ b \\ = \\ AC \\ ; \\ c \\ = \\ AB \\
157
+ \\overrightarrow{BA} \\cdot \\overrightarrow{BC} = \\overrightarrow{BH} \\cdot \\overrightarrow{BC}
96
158
  $$
97
159
 
160
+ ${(() => {
161
+ switch (sectorOfPointH) {
162
+ case "Entre $B$ et $C$":
163
+ return `Les points $B$,$H$ et $C$ sont alignés dans cet ordre. Par conséquent :
164
+
98
165
  $$
99
- ${sideNames[0]}^2 = ${sideNames[1]}^2 + ${sideNames[2]}^2 - 2 ${sideNames[1]} ${sideNames[2]} \\cos(${angleNames[0]})
166
+ \\overrightarrow{BH} \\cdot \\overrightarrow{BC} = BH \\times BC
100
167
  $$
101
168
 
169
+ `;
170
+ case "Après $C$":
171
+ return `Les points $B$,$C$ et $H$ sont alignés dans cet ordre. Par conséquent :
172
+
102
173
  $$
103
- \\cos(${angleNames[0]}) = ${nodeCosAngle.toTex()}
174
+ \\overrightarrow{BH} \\cdot \\overrightarrow{BC} = BH \\times BC
175
+ $$
176
+
177
+ `;
178
+ case "Avant $B$":
179
+ return `Les points $H$,$B$ et $C$ sont alignés dans cet ordre. Par conséquent :
180
+
181
+ $$
182
+ \\overrightarrow{BH} \\cdot \\overrightarrow{BC} = - BH \\times BC
104
183
  $$
105
184
 
106
- D'une part, par définition du produit scalaire :
185
+ `;
186
+ default:
187
+ throw new Error("Unsupported opts.sectorOfPointH: " + sectorOfPointH);
188
+ }
189
+ })()}
190
+
191
+
192
+ On va calculer $\\cos(${angleNames[0]})$ en utilisant le théorème d'Al-Kashi dans le triangle $ABC$.
193
+
194
+ En utilisant les notations suivantes :
107
195
 
108
196
  $$
109
- \\overrightarrow{BA} \\cdot \\overrightarrow{BC} = BA \\times BC \\times \\cos(${angleNames[0]})
197
+ a \\ = \\ BC \\ ; \\ b \\ = \\ AC \\ ; \\ c \\ = \\ AB \\
110
198
  $$
111
199
 
112
- D'autre part, puisque $B$,$C$ et $H$ sont alignés :
200
+ La formule d'Al-Kashi s'écrit :
201
+
202
+ $$
203
+ ${sideNames[0]}^2 = ${sideNames[1]}^2 + ${sideNames[2]}^2 - 2 ${sideNames[1]} ${sideNames[2]} \\cos(${angleNames[0]})
204
+ $$
113
205
 
114
206
  $$
115
- \\lvert \\overrightarrow{BH} \\cdot \\overrightarrow{BC} \\rvert = BH \\times BC
207
+ \\cos(${angleNames[0]}) = ${nodeCosAngle.toTex()}
116
208
  $$
117
209
 
118
210
  On a donc :
119
211
 
212
+ ${(() => {
213
+ switch (sectorOfPointH) {
214
+ case "Entre $B$ et $C$":
215
+ case "Après $C$":
216
+ return `
217
+
120
218
  $$
121
- BH = BA \\times \\lvert \\cos(${angleNames[0]}) \\rvert
219
+ BH = BA \\times \\cos(${angleNames[0]})
122
220
  $$
123
221
 
222
+ `;
223
+ case "Avant $B$":
224
+ return `
225
+
226
+ $$
227
+ BH = - BA \\times \\cos(${angleNames[0]})
228
+ $$
229
+
230
+ `;
231
+ default:
232
+ throw new Error("Unsupported opts.sectorOfPointH: " + sectorOfPointH);
233
+ }
234
+ })()}
235
+
124
236
  $$
125
237
  BH = ${nodeLengthBH.toTex()}
126
238
  $$
@@ -192,10 +304,28 @@ const getGGBOptions = (identifiers) => {
192
304
  });
193
305
  };
194
306
  const getPropositions = (n, { answer, ...identifiers }) => {
195
- const propositions = [];
196
- addValidProp(propositions, answer);
307
+ const propositionsMandatory = [];
308
+ addValidProp(propositionsMandatory, answer);
197
309
  const { sideLengths } = getHydrated(identifiers);
198
310
  const [BC, BA, _] = sideLengths;
311
+ //around answer
312
+ {
313
+ const vAnswer = getAnswerStuff(identifiers).nodeLengthBH.evaluate();
314
+ const createOffset = probaLawFlip([
315
+ [() => randfloat(0, 0.5, 2, [0]), 0.4],
316
+ [() => randfloat(-0.5, 0, 2, [0]), 0.4],
317
+ [() => randfloat(-0.5, 0.5, 2, [0]), 0.2],
318
+ ]);
319
+ const nbAroundAnswer = randint(1, 3);
320
+ const arrOffset = [...Array(nbAroundAnswer).keys()].map(createOffset);
321
+ arrOffset.forEach((vOffset) => {
322
+ const valueAnswerOffsetted = vAnswer + vOffset;
323
+ if (valueAnswerOffsetted > 0) {
324
+ tryToAddWrongProp(propositionsMandatory, round(valueAnswerOffsetted, precision).frenchify());
325
+ }
326
+ });
327
+ }
328
+ const propositionsFiller = [];
199
329
  const arrValueWrong = [];
200
330
  //student: sign error
201
331
  {
@@ -204,7 +334,7 @@ const getPropositions = (n, { answer, ...identifiers }) => {
204
334
  const nodeLengthBH = multiply(nodeLengthBA, abs(nodeCosAngle));
205
335
  const vWrong = nodeLengthBH.evaluate();
206
336
  arrValueWrong.push(vWrong);
207
- tryToAddWrongProp(propositions, round(vWrong, precision).frenchify());
337
+ tryToAddWrongProp(propositionsFiller, round(vWrong, precision).frenchify());
208
338
  }
209
339
  //student: computes AH instead of BH
210
340
  {
@@ -213,7 +343,7 @@ const getPropositions = (n, { answer, ...identifiers }) => {
213
343
  const nodeLengthAH = multiply(nodeLengthBA, abs(sin(arccos(nodeCosAngle))));
214
344
  const vWrong = nodeLengthAH.evaluate();
215
345
  arrValueWrong.push(vWrong);
216
- tryToAddWrongProp(propositions, round(vWrong, precision).frenchify());
346
+ tryToAddWrongProp(propositionsFiller, round(vWrong, precision).frenchify());
217
347
  }
218
348
  //student: pythagore with BA and BC
219
349
  {
@@ -221,31 +351,28 @@ const getPropositions = (n, { answer, ...identifiers }) => {
221
351
  const nodeWrong = sqrt(substract(power(BA, 2), power(BC, 2)));
222
352
  const vWrong = nodeWrong.evaluate();
223
353
  arrValueWrong.push(vWrong);
224
- tryToAddWrongProp(propositions, round(vWrong, precision).frenchify());
354
+ tryToAddWrongProp(propositionsFiller, round(vWrong, precision).frenchify());
225
355
  }
226
356
  }
227
- //terror: around answer, _most of the time_
357
+ //terror: around wrong
228
358
  {
229
- const value = (() => {
230
- const vAnswer = getAnswerStuff(identifiers).nodeLengthBH.evaluate();
231
- if (probaFlip(0.6)) {
232
- return vAnswer;
233
- }
234
- else {
235
- return random([...arrValueWrong, vAnswer]);
236
- }
237
- })();
359
+ const value = random([...arrValueWrong]);
238
360
  [...Array(2).keys()].forEach(() => {
239
361
  const valueAnswerOffsetted = value + randfloat(-1.2, 1.2, 2, [0]);
240
362
  if (valueAnswerOffsetted > 0) {
241
- tryToAddWrongProp(propositions, round(valueAnswerOffsetted, precision).frenchify());
363
+ tryToAddWrongProp(propositionsFiller, round(valueAnswerOffsetted, precision).frenchify());
242
364
  }
243
365
  });
244
366
  }
245
- propWhile(propositions, n, () => {
246
- tryToAddWrongProp(propositions, randfloat(2, 20, 2, [0, 20]).frenchify());
367
+ propWhile(propositionsFiller, n, () => {
368
+ tryToAddWrongProp(propositionsFiller, randfloat(2, 20, 2, [0, 20]).frenchify());
247
369
  });
248
- return shuffleProps(propositions, n);
370
+ return shuffle([
371
+ ...propositionsMandatory,
372
+ ...shuffleProps(propositionsFiller.filter((propositionFiller) => !propositionsMandatory
373
+ .map((proposition) => proposition.statement)
374
+ .includes(propositionFiller.statement)), n - propositionsMandatory.length),
375
+ ]);
249
376
  };
250
377
  const getKeys = () => {
251
378
  return [];
@@ -260,11 +387,8 @@ const isAnswerValid = (ans, { answer }) => {
260
387
  }
261
388
  };
262
389
  const getScalarProductAlKashiBHQuestion = (optsIn) => {
263
- const arrayedOptions = optsIn ?? optsDefault;
264
- const opts = {
265
- sectorOfPointH: random(arrayedOptions.sectorOfPointH),
266
- };
267
- const { sectorOfPointH } = opts;
390
+ const arrayedOptions = optsIn ?? arrayedOptsDefault;
391
+ const sectorOfPointH = random(arrayedOptions.sectorOfPointH);
268
392
  function createRandomPoints() {
269
393
  const offsetBtoC = 10;
270
394
  const pointB = new Point("B", randfloat(0, 10), randfloat(0, 10));
@@ -284,7 +408,7 @@ const getScalarProductAlKashiBHQuestion = (optsIn) => {
284
408
  case "Avant $B$":
285
409
  return multiply((-1).toTree(), nodeOffsetDtoE);
286
410
  default:
287
- throw new Error("Unsupported opts.sectorOfPointH: " + opts.sectorOfPointH);
411
+ throw new Error("Unsupported sectorOfPointH: " + sectorOfPointH);
288
412
  }
289
413
  })();
290
414
  const pointD = vecBCUnited.times(nodeOffsetBtoD).getEndPoint(pointB);
@@ -356,6 +480,7 @@ const getScalarProductAlKashiBHQuestion = (optsIn) => {
356
480
  const [B, A, C, H] = pointsCandidate;
357
481
  const triangle = new Triangle([A, B, C]);
358
482
  identifiers = {
483
+ sectorOfPointH,
359
484
  triangleIds: triangle.toIdentifiers(),
360
485
  pointIdsH: H.toIdentifiers(),
361
486
  };
@@ -377,7 +502,7 @@ const getScalarProductAlKashiBHQuestion = (optsIn) => {
377
502
  case "Avant $B$":
378
503
  return new Point("A", 5, 7);
379
504
  default:
380
- throw new Error("Unsupported opts.sectorOfPointH: " + opts.sectorOfPointH);
505
+ throw new Error("Unsupported opts.sectorOfPointH: " + sectorOfPointH);
381
506
  }
382
507
  })();
383
508
  const vecBC = VectorConstructor.fromPoints(pointB, pointC);
@@ -390,6 +515,7 @@ const getScalarProductAlKashiBHQuestion = (optsIn) => {
390
515
  const [B, A, C, H] = [pointB, pointA, pointC, pointH];
391
516
  const triangle = new Triangle([A, B, C]);
392
517
  const identifiersDefault = {
518
+ sectorOfPointH,
393
519
  triangleIds: triangle.toIdentifiers(),
394
520
  pointIdsH: H.toIdentifiers(),
395
521
  };
@@ -411,7 +537,7 @@ const getQuestionFromIdentifiers = (identifiers, opts) => {
411
537
  options: opts,
412
538
  };
413
539
  };
414
- const optsDefault = {
540
+ const arrayedOptsDefault = {
415
541
  sectorOfPointH: ["Entre $B$ et $C$"],
416
542
  };
417
543
  const options = [
@@ -421,13 +547,13 @@ const options = [
421
547
  target: GeneratorOptionTarget.generation,
422
548
  type: GeneratorOptionType.multiselect,
423
549
  values: ["Entre $B$ et $C$", "Après $C$", "Avant $B$"],
424
- defaultValue: optsDefault.sectorOfPointH,
550
+ defaultValue: arrayedOptsDefault.sectorOfPointH,
425
551
  },
426
552
  ];
427
553
  export const scalarProductAlKashiBH = {
428
554
  id: "scalarProductAlKashiBH",
429
555
  connector: "=",
430
- label: "Connaissant les longueurs de trois côtés d'un triangle $ABC$, calculer $BH$ ($H$ étant le pied de la hauteur issue de $A$)",
556
+ label: "Connaissant les longueurs de trois côtés d'un triangle $ABC$, calculer $BH$ ($H$ étant le pied de la hauteur issue de $A$) grâce au théorème d'Al-Kashi",
431
557
  isSingleStep: true,
432
558
  generator: (nb, opts) => getDistinctQuestions(() => getScalarProductAlKashiBHQuestion(opts), nb),
433
559
  options,
@@ -1 +1 @@
1
- {"version":3,"file":"scalarProductAlKashiSideLength.d.ts","sourceRoot":"","sources":["../../../../../../../src/exercises/math/geometry/vectors/scalarProduct/alKashi/scalarProductAlKashiSideLength.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAgBT,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAEL,mBAAmB,EACpB,MAAM,2CAA2C,CAAC;AAoBnD,KAAK,WAAW,GAAG;IACjB,WAAW,EAAE,mBAAmB,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AA4SF,eAAO,MAAM,8BAA8B,EAAE,QAAQ,CAAC,WAAW,CAsBhE,CAAC"}
1
+ {"version":3,"file":"scalarProductAlKashiSideLength.d.ts","sourceRoot":"","sources":["../../../../../../../src/exercises/math/geometry/vectors/scalarProduct/alKashi/scalarProductAlKashiSideLength.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAeT,MAAM,6BAA6B,CAAC;AAIrC,OAAO,EAGL,mBAAmB,EACpB,MAAM,2CAA2C,CAAC;AAqEnD,KAAK,WAAW,GAAG;IACjB,WAAW,EAAE,mBAAmB,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAuXF,eAAO,MAAM,8BAA8B,EAAE,QAAQ,CAAC,WAAW,CAsBhE,CAAC"}