import { useState } from 'preact/hooks' import { gcf } from './lib' import type { JSX } from 'preact' type SolutionParams = { factors : [ number, number ], gcf : number, result : number } function Solution({factors, gcf, result}:SolutionParams) { const multipliers = [ Math.floor(result/factors[0]), Math.floor(result/factors[1]), ] return

GCF({factors[0]}, {factors[1]}) = {gcf}

{factors[0]} × {factors[1]} ÷ {gcf} = {result}

{factors[0]} × {multipliers[0]} = {result}

{factors[1]} × {multipliers[1]} = {result}

} export function LCM() { // choose number between 2 and max inclusive const getRandomInt = (max : number) : number => Math.floor(Math.random() * (max - 1) + 2) const chooseFactorsRandom = () : [number, number] => { const f = getRandomInt(15) const max = Math.floor(200 / f) return [ f, getRandomInt(max) ] } const _chooseMultiplesOf = (f : number) : [number, number] => { const max = Math.floor(200 / f) return [ f * getRandomInt(max), f * getRandomInt(max) ] } /* const chooseMultiplesOf = (f : number) : () => [ number, number ] => { return () => _chooseMultiplesOf(f) } */ const chooseMultiples = () : [number, number] => { const f = getRandomInt(20) return _chooseMultiplesOf(f) } const chooseFactors = () : [number, number] => { const probabilities : Array<[number, () => [number, number]]>= [ [ 0.5, chooseFactorsRandom ], [ 0.5, chooseMultiples ], ] const r = Math.random() var i = 0, accum = 0 for (i = 0; i < probabilities.length; i++) { //console.log([r, i, accum, probabilities[i]]) if ((r > accum) && (r <= accum + probabilities[i][0])) break accum += probabilities[i][0] } if (i >= probabilities.length) i = probabilities.length - 1 return probabilities[i][1]() } const doCheck = (e : Event) : void => { e.preventDefault() const rightAnswer = Math.floor(factors[0] / gcf(factors[0], factors[1])) * factors[1] const yourAnswer = (document.getElementById("inlineFormInputResponse") as HTMLInputElement).value if (rightAnswer == Number(yourAnswer)) { setCorrect(true) setFeedback(true) } else { setFeedback(true) } } const doNext = (e : Event) : void => { e.preventDefault() setFeedback(false) setCorrect(false) setFactors(chooseFactors()) setSolution(null) document.forms[0].reset() } const doSolution = (e : Event) : void => { e.preventDefault() if (solution === null) { var answerBox = document.getElementById("inlineFormInputResponse") as HTMLInputElement const theGCF = gcf(factors[0], factors[1]) const rightAnswer = Math.floor(factors[0] / theGCF) * factors[1] answerBox.value = String(rightAnswer) setSolution() setCorrect(true) //setFeedback(true) } else { setSolution(null) } } const [factors, setFactors] = useState(chooseFactors()) const [correct, setCorrect] = useState(false) const [feedback, setFeedback] = useState(false) const [solution, setSolution] = useState(null) return (

Least Common Multiple Practice

What is the least common multiple of {factors[0]} and {factors[1]}?

{correct ? "Correct" : "Try again!"}
{solution !== null ? solution : <>}
) }