/** biome-ignore-all lint/a11y/useButtonType: */ /** biome-ignore-all lint/a11y/noSvgWithoutTitle: */ import { createSignal, Show, type Signal } from "solid-js"; type Digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"; type TimeString = `${Digit}${Digit}:${Digit}${Digit}`; /** * There is probably a browser built-in API for this but I am too tired to search for it. */ function parseTimeToSeconds(timeString: TimeString) { const [minutes, seconds] = timeString.split(":").map(Number); return minutes * 60 + seconds; } type Fraction = { numerator: number; denominator: number }; function getFraction(numerator: number, denominator: number): Fraction { const gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b)); const commonDivisor = gcd(numerator, denominator); return { numerator: numerator / commonDivisor, denominator: denominator / commonDivisor, }; } function Section({ index, fraction: [fraction, setFraction], }: { index: number; fraction: Signal; }) { function handleChange(event: Event) { if (!(event.target instanceof HTMLInputElement)) throw new Error("Target is expected to be an HTMLInputElement"); set(event.target.value as TimeString); } function set(value: TimeString) { const demoninator = parseTimeToSeconds(value); setFraction(getFraction(60, demoninator)); } let input: HTMLInputElement | undefined; return (
console.debug("test")} class="border-stone-400 p-2 border rounded-s-lg h-12 ml-[1ch]" /> minutes are {fraction().numerator} {fraction().denominator} units per minute
); } function getFractionRatio(a: Fraction, b: Fraction): Fraction { /* * a1/a2 / b1/b2 = (a1 * b2) / (a2 * b1) */ return { numerator: a.numerator * b.denominator, denominator: a.denominator * b.numerator, }; } export default function App() { // Abusing hours as minutes and minutes as seconds const [fraction1, setFraction1] = createSignal(getFraction(60, 60)); const [fraction2, setFraction2] = createSignal(getFraction(60, 60)); const fractionRatio = () => getFractionRatio(fraction1(), fraction2()); return (

Building 1

Building 2

You need {fractionRatio().denominator} of building 1

You need {fractionRatio().numerator} of building 2

); }