- TypeScript 소스 파일 내 모든 import 구문에서 불필요한 `.js` 확장자를 제거하여 모듈 참조 방식을 표준화했습니다. - 핸들러, 서비스, 리포지토리 및 테스트 코드를 포함한 프로젝트 전반의 import 경로를 일관성 있게 정리했습니다.
47 lines
1.3 KiB
TypeScript
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;
|
|
}
|