refactor: MONOREPO
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
import { lev, levW } from "../";
|
||||
|
||||
test("lev(abc, abc) == 0", () => {
|
||||
expect(lev("abc", "abc", 3, 3)).toBe(0);
|
||||
expect(levW("abc", "abc")).toBe(0);
|
||||
});
|
||||
|
||||
test("lev(abc, abd) == 1", () => {
|
||||
expect(lev("abc", "abd", 3, 3)).toBe(1);
|
||||
expect(levW("abc", "abd")).toBe(1);
|
||||
});
|
||||
|
||||
test("lev(abc, abcd) == 1", () => {
|
||||
expect(lev("abc", "abcd", 3, 4)).toBe(1);
|
||||
expect(levW("abc", "abcd")).toBe(1);
|
||||
});
|
||||
|
||||
test("lev(abcd, bcd) == 1", () => {
|
||||
expect(lev("abcd", "bcd", 4, 3)).toBe(1);
|
||||
expect(levW("abcd", "bcd")).toBe(1);
|
||||
});
|
||||
30
frontend/src/algorithms/levenshtein/index.ts
Normal file
30
frontend/src/algorithms/levenshtein/index.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
function one(a: string, b: string, i: number, j: number): number {
|
||||
if (a[i] === b[j]) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Computes the difference between the strings a and b.
|
||||
// @a, b: The strings to compare
|
||||
// @i, j: From where to compare (a_i and b_j)
|
||||
// @ret : The distance in insertions, deletions and changes
|
||||
export function lev(a: string, b: string, i: number, j: number): number {
|
||||
if (Math.min(i, j) === 0) {
|
||||
return Math.max(i, j);
|
||||
} else {
|
||||
return Math.min(
|
||||
lev(a, b, i - 1, j) + 1,
|
||||
lev(a, b, i, j - 1) + 1,
|
||||
lev(a, b, i - 1, j - 1) + one(a, b, i, j)
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
// Computes the difference between the strings a and b.
|
||||
// @a, b: The strings to compare
|
||||
// @ret : The distance in insertions, deletions and changes
|
||||
export function levW(a: string, b: string): number {
|
||||
return lev(a, b, a.length, b.length);
|
||||
}
|
||||
35
frontend/src/algorithms/sm2/index.ts
Normal file
35
frontend/src/algorithms/sm2/index.ts
Normal file
@@ -0,0 +1,35 @@
|
||||
import { dayInNDays } from "../../utils/date";
|
||||
|
||||
export interface ISchedulingData {
|
||||
easiness: number;
|
||||
consecutiveCorrectAnswers: number;
|
||||
nextDueDate: number;
|
||||
};
|
||||
|
||||
export enum AnswerType {
|
||||
CORRECT,
|
||||
WRONG,
|
||||
};
|
||||
|
||||
function performanceRating(answer: AnswerType): number {
|
||||
switch (answer) {
|
||||
case AnswerType.WRONG:
|
||||
return 1;
|
||||
case AnswerType.CORRECT:
|
||||
return 4;
|
||||
}
|
||||
}
|
||||
|
||||
export function updateSchedulingData(data: ISchedulingData, answer: AnswerType): ISchedulingData {
|
||||
const perfRating = performanceRating(answer);
|
||||
|
||||
data.easiness += -0.8 + 0.28 * perfRating + 0.02 * Math.pow(perfRating, 2);
|
||||
data.consecutiveCorrectAnswers = answer === AnswerType.CORRECT ? (
|
||||
data.consecutiveCorrectAnswers + 1
|
||||
) : 0;
|
||||
data.nextDueDate = answer === AnswerType.CORRECT ? (
|
||||
dayInNDays(6 * Math.pow(data.easiness, data.consecutiveCorrectAnswers - 1))
|
||||
) : dayInNDays(1);
|
||||
|
||||
return data;
|
||||
}
|
||||
Reference in New Issue
Block a user