website

source code for the ttmaths.uk website
Log | Files | Refs | README

commit 0e2dae595efbec805c6ad3df09bee4f083c54678
parent 1d2caaf2fa5bf75b8657687ee9cf9bc44e4191e1
Author: hrryt <harry@mayesfield.uk>
Date:   Sat,  8 Aug 2026 18:03:26 +0100

Restore questions

Diffstat:
Asrc/components/questions/AddingFractionsQuestion.jsx | 41+++++++++++++++++++++++++++++++++++++++++
Asrc/components/questions/QuadraticEquationQuestion.jsx | 90+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 131 insertions(+), 0 deletions(-)

diff --git a/src/components/questions/AddingFractionsQuestion.jsx b/src/components/questions/AddingFractionsQuestion.jsx @@ -0,0 +1,41 @@ +import Question from '../Question.jsx'; +import { getRandomInt, getHCF } from '/src/scripts/utils.js'; + +function formatFraction(num, denom) { + if (denom == 1) { return `${num}`; } + return num + '/' + denom; +} + +function simplifyFraction(num, denom) { + const hcf = getHCF(num, denom); + return [num / hcf, denom / hcf]; +} + +function getRandomFraction(seed) { + const num0 = getRandomInt(1, 5, seed); + const denom0 = getRandomInt(2, 10, seed + .05); + const [num, denom] = simplifyFraction(num0, denom0); + if (denom == 1) { return getRandomFraction(seed + .1); } + return [num, denom]; +} + +function getRandomFractions(seed) { + const [num1, denom1] = getRandomFraction(seed); + const [num2, denom2] = getRandomFraction(seed + .5); + return [num1, denom1, num2, denom2]; +} + +export default function AddingFractionsQuestion({ seed, showAnswer }) { + const [num1, denom1, num2, denom2] = getRandomFractions(seed); + + const question = formatFraction(num1, denom1) + ' + ' + formatFraction(num2, denom2); + + const hcf = getHCF(denom1, denom2); + const sum = (num1 * denom2 + num2 * denom1) / hcf; + const lcm = denom1 * denom2 / hcf; + const [num, denom] = simplifyFraction(sum, lcm); + + const answer = formatFraction(num, denom); + + return <Question question={question} answer={answer} showAnswer={showAnswer} />; +} diff --git a/src/components/questions/QuadraticEquationQuestion.jsx b/src/components/questions/QuadraticEquationQuestion.jsx @@ -0,0 +1,89 @@ +import Question from '../Question.jsx'; +<<<<<<< HEAD +import { getRandomInt, getRandomBoolean, getRandomChoice, formatCoefficient, getHCF } from '../../scripts/utils.js'; +======= +import { getRandomInt, getRandomBoolean, getRandomChoice, formatNumber } from '/src/scripts/utils.js'; +>>>>>>> 7778bc7 (Add cubic graphing component) + +function formatQuadraticExpression(a, b, c) { + const fa = formatCoefficient(a, { showPlus: false, showOne: false, showZero: false, suffix: 'x^2' }); + const fb = formatCoefficient(b, { showPlus: true, showOne: false, showZero: false, suffix: 'x' }); + const fc = formatCoefficient(c, { showPlus: true, showOne: true, showZero: false }); + return `${fa} ${fb} ${fc}`; +} + +function formatFraction(num, denom) { + const hcf = getHCF(Math.abs(num), Math.abs(denom)) + num = num / hcf + denom = denom / hcf + if (denom == 1) { return `${num}`; } + return `frac(${num}, ${denom})` +} + +function formatRoots(l, m, n, o) { + if (m / l == o / n) { return `x = ${formatFraction(-m, l)}`; } + if (-m / l == o / n) { return `x = plus.minus ${formatFraction(Math.abs(-m), l)}`; } + + return `x = ${formatFraction(-m, l)} "or" x = ${formatFraction(-o, n)}`; +} + +function formatFactor(x_coeff, const_coeff) { + if (const_coeff == 0) { return "x"; } + const fx_coeff = formatCoefficient(x_coeff, { showPlus: false, showOne: false, showZero: false, suffix: 'x'}) + const fconst_coeff = formatCoefficient(const_coeff, { showPlus: true, showOne: true, showZero: false }) + return `(${fx_coeff}${fconst_coeff})`; +} + +function formatFactors(l, m, n, o) { + if (l == n && m == o) { return `${formatFactor(l, m)}^2`} + return `${formatFactor(l, m)}${formatFactor(n, o)}` +} + +function getRandomRoots(seed) { + return [ + getRandomInt(-9, 9, seed), + getRandomInt(-9, 9, seed + .1), + ].sort((a, b) => a - b); +} + +export default function QuadraticEquationQuestion({ seed, showAnswer, aPlurality, framing, cSigns }) { + // (lx + m)(nx + o) + + const aChoices = Array(); + aPlurality.includes("a=1") && aChoices.push(1); + aPlurality.includes("a>1") && aChoices.push(2, 3); + let l = getRandomChoice(aChoices, seed); + let n = getRandomChoice(aChoices, seed + .1); + + const factoriseChoices = Array(); + framing.includes("Solve") && factoriseChoices.push(false); + framing.includes("Factorise") && factoriseChoices.push(true); + const factorise = getRandomChoice(factoriseChoices, seed + .2); + + const cSignChoices = Array(); + cSigns.includes("Positive") && cSignChoices.push(1) + cSigns.includes("Negative") && cSignChoices.push(-1) + + const mSign = getRandomChoice([-1, 1], seed + .3) + const cSign = getRandomChoice(cSignChoices, seed + .4) + + let m = getRandomInt(1, 9, seed + .5) * mSign + let o = getRandomInt(1, 9, seed + .6) * mSign * cSign + + if (-m/l > -o/n) { + [l, m, n, o] = [n, o, l, m] + } + + // lnx^2 + (lo + nm)x + mo + const a = l * n + const b = (l * o) + (n * m) + const c = m * o + + const quadratic = formatQuadraticExpression(a, b, c); + const question = factorise ? `"Factorise" ${quadratic}` : `"Solve" ${quadratic} = 0`; + + const answer = factorise ? formatFactors(l, m, n, o) : formatRoots(l, m, n, o); + + return <Question question={question} answer={answer} showAnswer={showAnswer} />; + +} +\ No newline at end of file