1export type SolveRank = "squire" | "knight" | "paladin";23export interface SolveResult {4 elapsedMs: number;5 resets: number;6}78const PALADIN_MAX_MS = 90_000;9const KNIGHT_MAX_MS = 240_000;1011export function getSolveRank(result: SolveResult): SolveRank {12 if (result.elapsedMs <= PALADIN_MAX_MS && result.resets === 0) {13 return "paladin";14 }15 if (result.elapsedMs <= KNIGHT_MAX_MS && result.resets <= 1) {16 return "knight";17 }18 return "squire";19}2021export function formatElapsed(elapsedMs: number): string {22 const totalSeconds = Math.max(0, Math.floor(elapsedMs / 1000));23 const minutes = Math.floor(totalSeconds / 60);24 const seconds = totalSeconds % 60;25 return `${minutes}:${String(seconds).padStart(2, "0")}`;26}