Files
encoach_frontend/src/utils/score.ts
2023-12-13 00:14:34 +00:00

164 lines
2.7 KiB
TypeScript

import {Module} from "@/interfaces";
import { LevelScore } from "@/constants/ielts";
type Type = "academic" | "general";
export const writingReverseMarking: {[key: number]: number} = {
9: 90,
8.5: 85,
8: 80,
7.5: 75,
7: 70,
6.5: 65,
6: 60,
5.5: 55,
5: 50,
4.5: 45,
4: 40,
3.5: 35,
3: 30,
2.5: 25,
2: 20,
1.5: 15,
1: 10,
0.5: 5,
0: 0,
};
export const speakingReverseMarking: {[key: number]: number} = {
9: 90,
8.5: 85,
8: 80,
7.5: 75,
7: 70,
6.5: 65,
6: 60,
5.5: 55,
5: 50,
4.5: 45,
4: 40,
3.5: 35,
3: 30,
2.5: 25,
2: 20,
1.5: 15,
1: 10,
0.5: 5,
0: 0,
};
export const writingMarking: {[key: number]: number} = {
90: 9,
80: 8,
70: 7,
60: 6,
50: 5,
40: 4,
30: 3,
20: 2,
10: 1,
0: 0,
};
const readingGeneralMarking: {[key: number]: number} = {
100: 9,
97.5: 8.5,
92.5: 8,
90: 7.5,
85: 7,
80: 6.5,
75: 6,
67.5: 5.5,
57.5: 5,
45.5: 4.5,
37.5: 4,
30: 3.5,
22.5: 3,
15: 2.5,
};
const academicMarking: {[key: number]: number} = {
97.5: 9,
92.5: 8.5,
87.5: 8,
80: 7.5,
75: 7,
65: 6.5,
57.5: 6,
45: 5.5,
40: 5,
32.5: 4.5,
25: 4,
20: 3.5,
15: 3,
10: 2.5,
};
const levelMarking: {[key: number]: number} = {
88: 9, // Advanced
64: 8 , // Upper-Intermediate
52: 6, // Intermediate
32: 4, // Pre-Intermediate
16: 2, // Elementary
0: 0, // Beginner
};
const moduleMarkings: {[key in Module]: {[key in Type]: {[key: number]: number}}} = {
reading: {
academic: academicMarking,
general: readingGeneralMarking,
},
listening: {
academic: academicMarking,
general: academicMarking,
},
writing: {
academic: writingMarking,
general: writingMarking,
},
speaking: {
academic: writingMarking,
general: writingMarking,
},
level: {
academic: levelMarking,
general: levelMarking,
},
};
export const calculateBandScore = (correct: number, total: number, module: Module, type: Type) => {
const marking = moduleMarkings[module][type];
const percentage = (correct * 100) / total;
for (const value of Object.keys(marking)
.map((x) => parseFloat(x))
.sort((a, b) => b - a)) {
if (percentage >= value) {
return marking[value];
}
}
return 0;
};
export const calculateAverageLevel = (levels: {[key in Module]: number}) => {
return Object.keys(levels).reduce((accumulator, current) => levels[current as Module] + accumulator, 0) / 4;
};
export const getLevelScore = (level: number) => {
switch(level) {
case 0:
return ['Beginner', 'Low A1'];
case 2:
return ['Elementary', 'High A1/Low A2'];
case 4:
return ['Pre-Intermediate', 'High A2/Low B1'];
case 6:
return ['Intermediate', 'High B1/Low B2'];
case 8:
return ['Upper-Intermediate', 'High B2/Low C1'];
case 9:
return ['Advanced', 'C1'];
default: return [];
}
}