SPB Git forge

spb/immbot-ai

Public
1commits 1branches 0releases
1.5 MBsize
maindefault branch
20 days agolast push
TypeScript 98.3% CSS 0.9% Shell 0.7%
1.4 KB · 44 lines typescript
Raw Blame History
1// Répétition espacée — SM-2 (SuperMemo-2), documenté dans docs/learning-science-strategy.md.2// Qualités : 2 = Encore (échec), 3 = Difficile, 4 = Bien, 5 = Facile.34export type CardState = {5  ef: number; // facteur de facilité6  intervalDays: number;7  reps: number;8  lapses: number;9};1011export type ReviewQuality = 2 | 3 | 4 | 5;1213export function initialCardState(): CardState {14  return { ef: 2.5, intervalDays: 0, reps: 0, lapses: 0 };15}1617export function reviewCard(state: CardState, q: ReviewQuality): CardState & { dueInDays: number } {18  let { ef, intervalDays, reps, lapses } = state;1920  // Mise à jour du facteur de facilité (formule SM-2)21  ef = ef + (0.1 - (5 - q) * (0.08 + (5 - q) * 0.02));22  if (ef < 1.3) ef = 1.3;2324  if (q < 3) {25    // Échec : la carte repart au début, revue dans la journée26    reps = 0;27    lapses += 1;28    intervalDays = 0;29    return { ef, intervalDays, reps, lapses, dueInDays: 0 };30  }3132  reps += 1;33  if (reps === 1) intervalDays = 1;34  else if (reps === 2) intervalDays = 6;35  else intervalDays = Math.round(intervalDays * ef);3637  // « Difficile » raccourcit l'intervalle ; « Facile » l'allonge légèrement38  if (q === 3) intervalDays = Math.max(1, Math.round(intervalDays * 0.8));39  if (q === 5) intervalDays = Math.round(intervalDays * 1.15);40  if (intervalDays > 365) intervalDays = 365;4142  return { ef, intervalDays, reps, lapses, dueInDays: intervalDays };43}44