윤정민 c94ce69e4f Remove redundant .js extensions from import paths.
- TypeScript 소스 파일 내 모든 import 구문에서 불필요한 `.js` 확장자를 제거하여 모듈 참조 방식을 표준화했습니다.
- 핸들러, 서비스, 리포지토리 및 테스트 코드를 포함한 프로젝트 전반의 import 경로를 일관성 있게 정리했습니다.
2026-05-06 16:17:51 +09:00

47 lines
1.3 KiB
TypeScript

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;
}