Files
encoach_frontend/src/utils/score.ts

102 lines
1.7 KiB
TypeScript

import {Module} from "@/interfaces";
type Type = "academic" | "general";
export const writingReverseMarking: {[key: number]: number} = {
9: 90,
8: 80,
7: 70,
6: 60,
5: 50,
4: 40,
3: 30,
2: 20,
1: 10,
0: 0,
};
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 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: academicMarking,
general: academicMarking,
},
};
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;
};