36 lines
987 B
TypeScript
36 lines
987 B
TypeScript
import { gcd } from "./fractions";
|
|
|
|
export function simplifyRatio(parts: number[]): number[] {
|
|
if (parts.length === 0) return [];
|
|
let g = parts[0];
|
|
for (let i = 1; i < parts.length; i++) {
|
|
g = gcd(g, parts[i]);
|
|
}
|
|
return parts.map((p) => p / g);
|
|
}
|
|
|
|
export function divideInRatio(total: number, parts: number[]): number[] {
|
|
const sum = parts.reduce((a, b) => a + b, 0);
|
|
const onePart = total / sum;
|
|
return parts.map((p) => p * onePart);
|
|
}
|
|
|
|
export function ratioToFraction(a: number, b: number): [number, number] {
|
|
return [a, a + b];
|
|
}
|
|
|
|
export function areEquivalent(ratio1: number[], ratio2: number[]): boolean {
|
|
if (ratio1.length !== ratio2.length) return false;
|
|
const s1 = simplifyRatio(ratio1);
|
|
const s2 = simplifyRatio(ratio2);
|
|
return s1.every((v, i) => v === s2[i]);
|
|
}
|
|
|
|
export function totalParts(parts: number[]): number {
|
|
return parts.reduce((a, b) => a + b, 0);
|
|
}
|
|
|
|
export function ratioToKatex(parts: number[]): string {
|
|
return parts.join(":");
|
|
}
|