import type { DailyJudgment } from "../types/panit"; export interface Thresholds { success: number; perfect: number; } /** * 그날 종료된(=completed) 경기 수를 기준으로 판정 기준을 반환한다. * * - 2경기 이하: `"skip"` — 스트릭 유지, 판정 유보. * - 3경기 이상: 과반(=floor((n+1)/2)) 이상 적중이면 성공, 전부 적중이면 퍼펙트. * * 표(기획서 2.5.1) 일치 검증: * - n=3 → success=2, perfect=3 * - n=4 → success=2, perfect=4 * - n=5 → success=3, perfect=5 */ export function thresholdsFor(completed: number): Thresholds | "skip" { if (completed <= 2) return "skip"; return { success: Math.floor((completed + 1) / 2), perfect: completed, }; } /** * 적중 수와 임계값으로 일간 판정을 결정한다. */ export function judgeByCounts(correct: number, t: Thresholds): DailyJudgment { if (correct >= t.perfect) return "perfect"; if (correct >= t.success) return "success"; return "fail"; } /** * 스트릭 유지·증가 시 지급되는 보너스 포인트. * 스트릭이 길수록 가산폭이 커지도록 완만한 계단 함수. */ export function streakBonus(streakAfter: number): number { if (streakAfter >= 30) return 20; if (streakAfter >= 14) return 10; if (streakAfter >= 7) return 5; if (streakAfter >= 3) return 2; return 0; }