+
Greatest Common Factor Practice
+
What is the greatest common factor of {factors[0]} and {factors[1]}?
+
+
+
{correct ? "Correct" : "Try again!"}
+
+ {solution !== null ? solution : <>>}
+
+ )
+}
diff --git a/src/index.css b/src/index.css
index 6119ad9..9af1897 100644
--- a/src/index.css
+++ b/src/index.css
@@ -24,7 +24,7 @@ a:hover {
body {
margin: 0;
- display: flex;
+ /*display: flex;*/
place-items: center;
min-width: 320px;
min-height: 100vh;
diff --git a/src/lcm.tsx b/src/lcm.tsx
new file mode 100644
index 0000000..18055c2
--- /dev/null
+++ b/src/lcm.tsx
@@ -0,0 +1,131 @@
+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(