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.
- package/lib/exercises/math/derivation/variations/signVarTable3dDegree.js +38 -10
- package/lib/exercises/math/derivation/variations/signVarTableFromDerivativeGraph.d.ts.map +1 -1
- package/lib/exercises/math/derivation/variations/signVarTableFromDerivativeGraph.js +7 -4
- package/lib/exercises/math/derivation/variations/signVarTableFromGraph.d.ts.map +1 -1
- package/lib/exercises/math/derivation/variations/signVarTableFromGraph.js +2 -3
- package/lib/exercises/math/functions/trinoms/problems/index.d.ts +1 -0
- package/lib/exercises/math/functions/trinoms/problems/index.d.ts.map +1 -1
- package/lib/exercises/math/functions/trinoms/problems/index.js +1 -0
- package/lib/exercises/math/functions/trinoms/problems/rectangleSizesFromPerimeterAndArea.d.ts +9 -0
- package/lib/exercises/math/functions/trinoms/problems/rectangleSizesFromPerimeterAndArea.d.ts.map +1 -0
- package/lib/exercises/math/functions/trinoms/problems/rectangleSizesFromPerimeterAndArea.js +202 -0
- package/lib/exercises/math/functions/variations/partialVarTableFromGraph.d.ts.map +1 -1
- package/lib/exercises/math/functions/variations/partialVarTableFromGraph.js +2 -1
- package/lib/exercises/math/functions/variations/varTableFromGraph.d.ts.map +1 -1
- package/lib/exercises/math/functions/variations/varTableFromGraph.js +2 -1
- package/lib/exercises/math/functions/variations/varTableFromSentences.d.ts.map +1 -1
- package/lib/exercises/math/functions/variations/varTableFromSentences.js +2 -1
- package/lib/exercises/math/geometry/circles/circleCenterAndRadiusFromEquation.d.ts.map +1 -1
- package/lib/exercises/math/geometry/circles/circleCenterAndRadiusFromEquation.js +0 -2
- package/lib/exercises/math/geometry/vectors/scalarProduct/alKashi/scalarProductAlKashiAngle.d.ts.map +1 -1
- package/lib/exercises/math/geometry/vectors/scalarProduct/alKashi/scalarProductAlKashiAngle.js +64 -60
- package/lib/exercises/math/geometry/vectors/scalarProduct/alKashi/scalarProductAlKashiBH.d.ts +1 -0
- package/lib/exercises/math/geometry/vectors/scalarProduct/alKashi/scalarProductAlKashiBH.d.ts.map +1 -1
- package/lib/exercises/math/geometry/vectors/scalarProduct/alKashi/scalarProductAlKashiBH.js +173 -47
- package/lib/exercises/math/geometry/vectors/scalarProduct/alKashi/scalarProductAlKashiSideLength.d.ts.map +1 -1
- package/lib/exercises/math/geometry/vectors/scalarProduct/alKashi/scalarProductAlKashiSideLength.js +112 -46
- package/lib/exercises/math/geometry/vectors/scalarProduct/alg/scalarProductIdentities.js +1 -1
- package/lib/exercises/math/geometry/vectors/scalarProduct/alg/scalarProductInOrthonormalBasisIJ.d.ts.map +1 -1
- package/lib/exercises/math/geometry/vectors/scalarProduct/alg/scalarProductInOrthonormalBasisIJ.js +6 -0
- package/lib/exercises/math/geometry/vectors/scalarProduct/alg/scalarProductLamdbaULambdaV.d.ts.map +1 -1
- package/lib/exercises/math/geometry/vectors/scalarProduct/alg/scalarProductLamdbaULambdaV.js +60 -82
- package/lib/exercises/math/geometry/vectors/scalarProduct/angleFromScalarProduct.d.ts.map +1 -1
- package/lib/exercises/math/geometry/vectors/scalarProduct/angleFromScalarProduct.js +92 -6
- package/lib/exercises/math/geometry/vectors/scalarProduct/index.d.ts +6 -1
- package/lib/exercises/math/geometry/vectors/scalarProduct/index.d.ts.map +1 -1
- package/lib/exercises/math/geometry/vectors/scalarProduct/index.js +6 -1
- package/lib/exercises/math/geometry/vectors/scalarProduct/orth/scalarProductIsOrthogonalVecsBasisIJ.d.ts.map +1 -1
- package/lib/exercises/math/geometry/vectors/scalarProduct/orth/scalarProductIsOrthogonalVecsBasisIJ.js +6 -0
- package/lib/exercises/math/geometry/vectors/scalarProduct/orth/scalarProductIsOrthogonalVecsUsingCoords.js +1 -1
- package/lib/exercises/math/geometry/vectors/scalarProduct/orth/scalarProductIsPointOnCircle.d.ts.map +1 -1
- package/lib/exercises/math/geometry/vectors/scalarProduct/orth/scalarProductIsPointOnCircle.js +15 -5
- package/lib/exercises/math/geometry/vectors/scalarProduct/orth/scalarProductIsPointOnPerpendicularBisector.d.ts.map +1 -1
- package/lib/exercises/math/geometry/vectors/scalarProduct/orth/scalarProductIsPointOnPerpendicularBisector.js +18 -14
- package/lib/exercises/math/geometry/vectors/scalarProduct/orth/scalarProductIsRightTriangleUsingPointCoords.d.ts.map +1 -1
- package/lib/exercises/math/geometry/vectors/scalarProduct/orth/scalarProductIsRightTriangleUsingPointCoords.js +15 -5
- package/lib/exercises/math/geometry/vectors/scalarProduct/scalarProductComputeBH.d.ts.map +1 -1
- package/lib/exercises/math/geometry/vectors/scalarProduct/scalarProductComputeBH.js +38 -4
- package/lib/exercises/math/geometry/vectors/scalarProduct/scalarProductOfVectsOnGrid1.d.ts.map +1 -1
- package/lib/exercises/math/geometry/vectors/scalarProduct/scalarProductOfVectsOnGrid1.js +77 -26
- package/lib/exercises/math/geometry/vectors/scalarProduct/scalarProductParallelogramDiagonalPlus.d.ts.map +1 -1
- package/lib/exercises/math/geometry/vectors/scalarProduct/scalarProductParallelogramDiagonalPlus.js +6 -7
- package/lib/exercises/math/probaStat/basicProbas/calculateProbaFromProbaLaw.js +1 -1
- package/lib/exercises/math/probaStat/probaFromTableWithContext.d.ts.map +1 -1
- package/lib/exercises/math/probaStat/probaFromTableWithContext.js +3 -16
- package/lib/exercises/math/probaStat/randomVariable/calculateProbaFromVATableLaw.d.ts +11 -0
- package/lib/exercises/math/probaStat/randomVariable/calculateProbaFromVATableLaw.d.ts.map +1 -0
- package/lib/exercises/math/probaStat/randomVariable/calculateProbaFromVATableLaw.js +232 -0
- package/lib/exercises/math/probaStat/randomVariable/decideWhichGameIsLessRisky.d.ts +14 -0
- package/lib/exercises/math/probaStat/randomVariable/decideWhichGameIsLessRisky.d.ts.map +1 -0
- package/lib/exercises/math/probaStat/randomVariable/decideWhichGameIsLessRisky.js +167 -0
- package/lib/exercises/math/probaStat/randomVariable/findValueForFairRandomVariable.d.ts.map +1 -1
- package/lib/exercises/math/probaStat/randomVariable/findValueForFairRandomVariable.js +29 -56
- package/lib/exercises/math/probaStat/randomVariable/index.d.ts +8 -0
- package/lib/exercises/math/probaStat/randomVariable/index.d.ts.map +1 -1
- package/lib/exercises/math/probaStat/randomVariable/index.js +9 -0
- package/lib/exercises/math/probaStat/randomVariable/isTableProbabilityLaw.d.ts.map +1 -1
- package/lib/exercises/math/probaStat/randomVariable/isTableProbabilityLaw.js +6 -6
- package/lib/exercises/math/probaStat/randomVariable/randomVariableAverage.js +1 -1
- package/lib/exercises/math/probaStat/randomVariable/randomVariableFindMissingProbabilityInLaw.d.ts +9 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableFindMissingProbabilityInLaw.d.ts.map +1 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableFindMissingProbabilityInLaw.js +116 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationAverage.d.ts +11 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationAverage.d.ts.map +1 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationAverage.js +112 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationComputeProbability.d.ts +9 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationComputeProbability.d.ts.map +1 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationComputeProbability.js +176 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationIsGameFavorable.d.ts +8 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationIsGameFavorable.d.ts.map +1 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationIsGameFavorable.js +94 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationProbabilityLaw.d.ts +9 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationProbabilityLaw.d.ts.map +1 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationProbabilityLaw.js +162 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationStandardDeviation.d.ts +8 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationStandardDeviation.d.ts.map +1 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationStandardDeviation.js +133 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationValues.d.ts +8 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationValues.d.ts.map +1 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationValues.js +211 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationVariance.d.ts +8 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationVariance.d.ts.map +1 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableSituationVariance.js +113 -0
- package/lib/exercises/math/probaStat/randomVariable/randomVariableStandardDeviation.js +1 -1
- package/lib/exercises/math/probaStat/randomVariable/randomVariableVariance.js +1 -1
- package/lib/exercises/math/probaStat/randomVariable/utils/buildVAOfGivenAverage.d.ts +31 -0
- package/lib/exercises/math/probaStat/randomVariable/utils/buildVAOfGivenAverage.d.ts.map +1 -0
- package/lib/exercises/math/probaStat/randomVariable/utils/buildVAOfGivenAverage.js +192 -0
- package/lib/exercises/math/probaStat/randomVariable/utils/randomVariableSituations.d.ts +40 -11
- package/lib/exercises/math/probaStat/randomVariable/utils/randomVariableSituations.d.ts.map +1 -1
- package/lib/exercises/math/probaStat/randomVariable/utils/randomVariableSituations.js +172 -30
- package/lib/exercises/math/probaStat/stats1var/medianWithList.d.ts.map +1 -1
- package/lib/exercises/math/probaStat/stats1var/medianWithList.js +16 -2
- package/lib/exercises/math/sequences/arithmetic/arithmeticVariations.js +1 -1
- package/lib/exercises/math/trigonometry/circle/placeAssociateAngleOnCircle.d.ts.map +1 -1
- package/lib/exercises/math/trigonometry/circle/placeAssociateAngleOnCircle.js +0 -2
- package/lib/exercises/vea/rationalVEA.d.ts.map +1 -1
- package/lib/exercises/vea/rationalVEA.js +7 -3
- package/lib/exercises/vea/varLineVEA.d.ts.map +1 -1
- package/lib/exercises/vea/varLineVEA.js +2 -1
- package/lib/exercises/vea/varSignTableVEA.d.ts +8 -0
- package/lib/exercises/vea/varSignTableVEA.d.ts.map +1 -1
- package/lib/exercises/vea/varSignTableVEA.js +8 -0
- package/lib/exercises/vea/xTableLineVEA.d.ts +1 -0
- package/lib/exercises/vea/xTableLineVEA.d.ts.map +1 -1
- package/lib/exercises/vea/xTableLineVEA.js +1 -0
- package/lib/index.d.ts +86 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/latexTester.d.ts.map +1 -1
- package/lib/latexTester.js +3 -1
- package/lib/math/geometry/angle.d.ts +2 -0
- package/lib/math/geometry/angle.d.ts.map +1 -1
- package/lib/math/geometry/angle.js +17 -0
- package/lib/math/geometry/point.js +2 -2
- package/lib/math/geometry/segment.js +1 -1
- package/lib/math/numbers/reals/real.d.ts.map +1 -1
- package/lib/math/numbers/reals/real.js +4 -0
- package/lib/math/probability/randomVariable.d.ts +2 -1
- package/lib/math/probability/randomVariable.d.ts.map +1 -1
- package/lib/math/probability/randomVariable.js +7 -1
- package/lib/math/utils/arithmetic/primeFactors.d.ts +1 -1
- package/lib/math/utils/arithmetic/primeFactors.d.ts.map +1 -1
- package/lib/math/utils/arithmetic/primeFactors.js +23 -9
- package/lib/math/utils/random/randTupleInt.d.ts +1 -0
- package/lib/math/utils/random/randTupleInt.d.ts.map +1 -1
- package/lib/math/utils/random/randTupleInt.js +3 -0
- package/lib/tests/exosTest.d.ts.map +1 -1
- package/lib/tests/exosTest.js +2 -0
- package/lib/tests/pdfs/mdTableToLatexTabular.js +1 -1
- package/lib/tree/nodes/algebraicNode.d.ts +1 -0
- package/lib/tree/nodes/algebraicNode.d.ts.map +1 -1
- package/lib/tree/nodes/complex/complexNode.d.ts +1 -0
- package/lib/tree/nodes/complex/complexNode.d.ts.map +1 -1
- package/lib/tree/nodes/complex/complexNode.js +3 -0
- package/lib/tree/nodes/equations/equalNode.d.ts +1 -0
- package/lib/tree/nodes/equations/equalNode.d.ts.map +1 -1
- package/lib/tree/nodes/equations/equalNode.js +3 -0
- package/lib/tree/nodes/equations/equationSolutionNode.d.ts +1 -0
- package/lib/tree/nodes/equations/equationSolutionNode.d.ts.map +1 -1
- package/lib/tree/nodes/equations/equationSolutionNode.js +3 -0
- package/lib/tree/nodes/equations/multiEqualNode.d.ts +1 -0
- package/lib/tree/nodes/equations/multiEqualNode.d.ts.map +1 -1
- package/lib/tree/nodes/equations/multiEqualNode.js +3 -0
- package/lib/tree/nodes/equations/notEqualNode.d.ts +1 -0
- package/lib/tree/nodes/equations/notEqualNode.d.ts.map +1 -1
- package/lib/tree/nodes/equations/notEqualNode.js +3 -0
- package/lib/tree/nodes/functions/absNode.d.ts +1 -0
- package/lib/tree/nodes/functions/absNode.d.ts.map +1 -1
- package/lib/tree/nodes/functions/absNode.js +7 -0
- package/lib/tree/nodes/functions/arcSinNode.d.ts +1 -0
- package/lib/tree/nodes/functions/arcSinNode.d.ts.map +1 -1
- package/lib/tree/nodes/functions/arcSinNode.js +7 -0
- package/lib/tree/nodes/functions/arccosNode.d.ts +1 -0
- package/lib/tree/nodes/functions/arccosNode.d.ts.map +1 -1
- package/lib/tree/nodes/functions/arccosNode.js +7 -0
- package/lib/tree/nodes/functions/arctanNode.d.ts +1 -0
- package/lib/tree/nodes/functions/arctanNode.d.ts.map +1 -1
- package/lib/tree/nodes/functions/arctanNode.js +7 -0
- package/lib/tree/nodes/functions/cosNode.d.ts +1 -0
- package/lib/tree/nodes/functions/cosNode.d.ts.map +1 -1
- package/lib/tree/nodes/functions/cosNode.js +7 -0
- package/lib/tree/nodes/functions/expNode.d.ts +1 -0
- package/lib/tree/nodes/functions/expNode.d.ts.map +1 -1
- package/lib/tree/nodes/functions/expNode.js +7 -0
- package/lib/tree/nodes/functions/factorialNode.d.ts +30 -0
- package/lib/tree/nodes/functions/factorialNode.d.ts.map +1 -0
- package/lib/tree/nodes/functions/factorialNode.js +79 -0
- package/lib/tree/nodes/functions/functionNode.d.ts +2 -1
- package/lib/tree/nodes/functions/functionNode.d.ts.map +1 -1
- package/lib/tree/nodes/functions/functionNode.js +1 -0
- package/lib/tree/nodes/functions/integralNode.d.ts +1 -0
- package/lib/tree/nodes/functions/integralNode.d.ts.map +1 -1
- package/lib/tree/nodes/functions/integralNode.js +7 -0
- package/lib/tree/nodes/functions/log10Node.d.ts +1 -0
- package/lib/tree/nodes/functions/log10Node.d.ts.map +1 -1
- package/lib/tree/nodes/functions/log10Node.js +7 -0
- package/lib/tree/nodes/functions/logNode.d.ts +1 -0
- package/lib/tree/nodes/functions/logNode.d.ts.map +1 -1
- package/lib/tree/nodes/functions/logNode.js +9 -0
- package/lib/tree/nodes/functions/oppositeNode.d.ts +1 -0
- package/lib/tree/nodes/functions/oppositeNode.d.ts.map +1 -1
- package/lib/tree/nodes/functions/oppositeNode.js +7 -0
- package/lib/tree/nodes/functions/sinNode.d.ts +1 -0
- package/lib/tree/nodes/functions/sinNode.d.ts.map +1 -1
- package/lib/tree/nodes/functions/sinNode.js +7 -0
- package/lib/tree/nodes/functions/sqrtNode.d.ts +1 -0
- package/lib/tree/nodes/functions/sqrtNode.d.ts.map +1 -1
- package/lib/tree/nodes/functions/sqrtNode.js +7 -0
- package/lib/tree/nodes/functions/tanNode.d.ts +1 -0
- package/lib/tree/nodes/functions/tanNode.d.ts.map +1 -1
- package/lib/tree/nodes/functions/tanNode.js +7 -0
- package/lib/tree/nodes/geometry/degree.d.ts +1 -0
- package/lib/tree/nodes/geometry/degree.d.ts.map +1 -1
- package/lib/tree/nodes/geometry/degree.js +7 -0
- package/lib/tree/nodes/geometry/lengthNode.d.ts +1 -0
- package/lib/tree/nodes/geometry/lengthNode.d.ts.map +1 -1
- package/lib/tree/nodes/geometry/lengthNode.js +7 -0
- package/lib/tree/nodes/geometry/pointNode.d.ts +1 -0
- package/lib/tree/nodes/geometry/pointNode.d.ts.map +1 -1
- package/lib/tree/nodes/geometry/pointNode.js +7 -0
- package/lib/tree/nodes/geometry/vectorNode.d.ts +1 -0
- package/lib/tree/nodes/geometry/vectorNode.d.ts.map +1 -1
- package/lib/tree/nodes/geometry/vectorNode.js +7 -0
- package/lib/tree/nodes/inequations/inequationNode.d.ts +1 -0
- package/lib/tree/nodes/inequations/inequationNode.d.ts.map +1 -1
- package/lib/tree/nodes/inequations/inequationNode.js +7 -0
- package/lib/tree/nodes/inequations/inequationSolutionNode.d.ts +1 -0
- package/lib/tree/nodes/inequations/inequationSolutionNode.d.ts.map +1 -1
- package/lib/tree/nodes/inequations/inequationSolutionNode.js +7 -0
- package/lib/tree/nodes/node.d.ts +2 -1
- package/lib/tree/nodes/node.d.ts.map +1 -1
- package/lib/tree/nodes/node.js +2 -0
- package/lib/tree/nodes/nodeConstructor.d.ts.map +1 -1
- package/lib/tree/nodes/nodeConstructor.js +4 -0
- package/lib/tree/nodes/numbers/percentNode.d.ts +1 -0
- package/lib/tree/nodes/numbers/percentNode.d.ts.map +1 -1
- package/lib/tree/nodes/numbers/percentNode.js +7 -0
- package/lib/tree/nodes/operators/addNode.d.ts +1 -0
- package/lib/tree/nodes/operators/addNode.d.ts.map +1 -1
- package/lib/tree/nodes/operators/addNode.js +7 -0
- package/lib/tree/nodes/operators/binomialCoefficientNode.d.ts +2 -1
- package/lib/tree/nodes/operators/binomialCoefficientNode.d.ts.map +1 -1
- package/lib/tree/nodes/operators/binomialCoefficientNode.js +18 -2
- package/lib/tree/nodes/operators/divideNode.d.ts +1 -0
- package/lib/tree/nodes/operators/divideNode.d.ts.map +1 -1
- package/lib/tree/nodes/operators/divideNode.js +7 -0
- package/lib/tree/nodes/operators/fractionNode.d.ts +1 -0
- package/lib/tree/nodes/operators/fractionNode.d.ts.map +1 -1
- package/lib/tree/nodes/operators/fractionNode.js +7 -0
- package/lib/tree/nodes/operators/limitNode.d.ts +1 -0
- package/lib/tree/nodes/operators/limitNode.d.ts.map +1 -1
- package/lib/tree/nodes/operators/limitNode.js +7 -0
- package/lib/tree/nodes/operators/multiplyNode.d.ts +1 -0
- package/lib/tree/nodes/operators/multiplyNode.d.ts.map +1 -1
- package/lib/tree/nodes/operators/multiplyNode.js +7 -0
- package/lib/tree/nodes/operators/powerNode.d.ts +1 -0
- package/lib/tree/nodes/operators/powerNode.d.ts.map +1 -1
- package/lib/tree/nodes/operators/powerNode.js +7 -0
- package/lib/tree/nodes/operators/substractNode.d.ts +1 -0
- package/lib/tree/nodes/operators/substractNode.d.ts.map +1 -1
- package/lib/tree/nodes/operators/substractNode.js +7 -0
- package/lib/tree/nodes/polynomials/monomNode.d.ts +1 -0
- package/lib/tree/nodes/polynomials/monomNode.d.ts.map +1 -1
- package/lib/tree/nodes/polynomials/monomNode.js +7 -0
- package/lib/tree/nodes/polynomials/trinomNode.d.ts +1 -0
- package/lib/tree/nodes/polynomials/trinomNode.d.ts.map +1 -1
- package/lib/tree/nodes/polynomials/trinomNode.js +7 -0
- package/lib/tree/nodes/sets/belongsNode.d.ts +1 -0
- package/lib/tree/nodes/sets/belongsNode.d.ts.map +1 -1
- package/lib/tree/nodes/sets/belongsNode.js +7 -0
- package/lib/tree/nodes/sets/discreteSetNode.d.ts +1 -0
- package/lib/tree/nodes/sets/discreteSetNode.d.ts.map +1 -1
- package/lib/tree/nodes/sets/discreteSetNode.js +7 -0
- package/lib/tree/nodes/sets/intervalNode.d.ts +1 -0
- package/lib/tree/nodes/sets/intervalNode.d.ts.map +1 -1
- package/lib/tree/nodes/sets/intervalNode.js +7 -0
- package/lib/tree/nodes/sets/unionIntervalNode.d.ts +1 -0
- package/lib/tree/nodes/sets/unionIntervalNode.d.ts.map +1 -1
- package/lib/tree/nodes/sets/unionIntervalNode.js +7 -0
- package/lib/tree/nodes/variables/variableNode.d.ts +1 -0
- package/lib/tree/nodes/variables/variableNode.d.ts.map +1 -1
- package/lib/tree/nodes/variables/variableNode.js +7 -0
- package/lib/tree/utilities/nodeShuffler.d.ts.map +1 -1
- package/lib/tree/utilities/nodeShuffler.js +3 -0
- package/lib/tree/utilities/nodeSimplifier.d.ts.map +1 -1
- package/lib/tree/utilities/nodeSimplifier.js +3 -0
- package/package.json +1 -1
package/lib/exercises/math/geometry/vectors/scalarProduct/alKashi/scalarProductAlKashiAngle.js
CHANGED
|
@@ -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
|
-
|
|
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 l’angle $${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).
|
|
60
|
+
return getAnswerStuff(identifiers).angleInDegreesRounded.toTree();
|
|
56
61
|
};
|
|
57
62
|
const getAnswer = (identifiers) => {
|
|
58
|
-
return
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
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
|
-
\\
|
|
112
|
+
a \\ = \\ BC \\ ; \\ b \\ = \\ AC \\ ; \\ c \\ = \\ AB \\
|
|
92
113
|
$$
|
|
93
114
|
|
|
94
|
-
|
|
115
|
+
Avec ces notations, d'après le théorème d'Al-Kashi :
|
|
95
116
|
|
|
96
117
|
$$
|
|
97
|
-
${
|
|
118
|
+
${sideNames[0]}^2 = ${sideNames[1]}^2 + ${sideNames[2]}^2 - 2 ${sideNames[1]} ${sideNames[2]} \\cos(${angleNames[0]})
|
|
98
119
|
$$
|
|
99
120
|
|
|
100
|
-
|
|
121
|
+
On a donc
|
|
101
122
|
|
|
102
|
-
|
|
103
|
-
${angleNames[0]}
|
|
104
|
-
|
|
123
|
+
${alignTex([
|
|
124
|
+
[`\\cos(${angleNames[0]})`, "=", `${nodeCosAngleWithVars.toTex()}`],
|
|
125
|
+
["", "=", `${nodeCosAngleWithValues.toTex()}`],
|
|
126
|
+
])}
|
|
105
127
|
|
|
106
|
-
|
|
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)}
|
|
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
|
|
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
|
|
202
|
-
|
|
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
|
};
|
package/lib/exercises/math/geometry/vectors/scalarProduct/alKashi/scalarProductAlKashiBH.d.ts
CHANGED
|
@@ -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
|
};
|
package/lib/exercises/math/geometry/vectors/scalarProduct/alKashi/scalarProductAlKashiBH.d.ts.map
CHANGED
|
@@ -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;
|
|
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 {
|
|
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
|
-
|
|
54
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 `
|
|
148
|
+
return `D'une part, par définition du produit scalaire :
|
|
91
149
|
|
|
92
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
\\
|
|
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
|
-
|
|
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
|
-
\\
|
|
197
|
+
a \\ = \\ BC \\ ; \\ b \\ = \\ AC \\ ; \\ c \\ = \\ AB \\
|
|
110
198
|
$$
|
|
111
199
|
|
|
112
|
-
|
|
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
|
-
\\
|
|
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 =
|
|
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
|
|
196
|
-
addValidProp(
|
|
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(
|
|
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(
|
|
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(
|
|
354
|
+
tryToAddWrongProp(propositionsFiller, round(vWrong, precision).frenchify());
|
|
225
355
|
}
|
|
226
356
|
}
|
|
227
|
-
//terror: around
|
|
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(
|
|
363
|
+
tryToAddWrongProp(propositionsFiller, round(valueAnswerOffsetted, precision).frenchify());
|
|
242
364
|
}
|
|
243
365
|
});
|
|
244
366
|
}
|
|
245
|
-
propWhile(
|
|
246
|
-
tryToAddWrongProp(
|
|
367
|
+
propWhile(propositionsFiller, n, () => {
|
|
368
|
+
tryToAddWrongProp(propositionsFiller, randfloat(2, 20, 2, [0, 20]).frenchify());
|
|
247
369
|
});
|
|
248
|
-
return
|
|
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 ??
|
|
264
|
-
const
|
|
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
|
|
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: " +
|
|
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
|
|
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:
|
|
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,
|
|
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"}
|