Skip to content

Instantly share code, notes, and snippets.

@ChrisDobby
Last active March 13, 2023 08:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ChrisDobby/32698b179749146f2ee5a1c5c7f342f7 to your computer and use it in GitHub Desktop.
Save ChrisDobby/32698b179749146f2ee5a1c5c7f342f7 to your computer and use it in GitHub Desktop.
Write a function that can do the 4 basic operations (add, subtract, multiply and divide) on two fractions. Return the most simplified form of the result.
type FractionString = `${number}/${number}`
type Fraction = { numerator: number; denominator: number }
type Operation = 'add' | 'subtract' | 'multiply' | 'divide'
const simplify = ({ numerator, denominator }: Fraction) => {
const commonDivisor = (n: number, d: number) => (d === 0 ? n : commonDivisor(d, n % d))
const divisor = commonDivisor(numerator, denominator)
return { numerator: numerator / divisor, denominator: denominator / divisor }
}
const getFraction = (fraction: FractionString) => {
const [numerator, denominator] = fraction.split('/').map(Number)
return { numerator, denominator }
}
const operate: Record<Operation, (f1: Fraction, f2: Fraction) => Fraction> = {
add: ({ numerator: n1, denominator: d1 }, { numerator: n2, denominator: d2 }) => ({ numerator: n1 * d2 + n2 * d1, denominator: d1 * d2 }),
subtract: ({ numerator: n1, denominator: d1 }, { numerator: n2, denominator: d2 }) => ({ numerator: n1 * d2 - n2 * d1, denominator: d1 * d2 }),
multiply: ({ numerator: n1, denominator: d1 }, { numerator: n2, denominator: d2 }) => ({ numerator: n1 * n2, denominator: d1 * d2 }),
divide: ({ numerator: n1, denominator: d1 }, { numerator: n2, denominator: d2 }) => ({ numerator: n1 * d2, denominator: d1 * n2 }),
}
const fractionMath = (f1: FractionString, op: Operation, f2: FractionString) => {
const result = simplify(operate[op](getFraction(f1), getFraction(f2)))
return `${result.numerator}/${result.denominator}`
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment