Solución
solution.tsTypeScript
interface GradeResult {
average: number;
grade: string;
passed: boolean;
bonus: number;
}
const WORD_SCORES = {
excellent: 'A',
good: 'B',
normal: 'C',
low: 'D',
failed: 'F'
}
const SCORE_EXCELLENT = 90
const SCORE_GOOD = 80
const SCORE_NORMAL = 70
const SCORE_LOW = 60
const BONUS = {
max: 10,
min: 5,
}
const SUBJECTS = {
math: 'math',
science: 'science'
}
const ZERO = 0;
function calcTotalScores(scores: number[]) {
return scores.reduce((acc, score) => {
return acc + score
}, ZERO)
}
function calcWordScore(average: number) {
if (average >= SCORE_EXCELLENT) {
return WORD_SCORES.excellent;
}
if (average >= SCORE_GOOD) {
return WORD_SCORES.good;
}
if (average >= SCORE_NORMAL) {
return WORD_SCORES.normal;
}
if (average >= SCORE_LOW) {
return WORD_SCORES.low;
}
return WORD_SCORES.failed;
}
function calcBonus(subject: string, average: number) {
if (subject === SUBJECTS.math && average >= SCORE_EXCELLENT) {
return BONUS.max;
}
if (subject === SUBJECTS.science && average >= SCORE_GOOD) {
return BONUS.min;
}
return ZERO
}
export function processStudentGrades(scores: number[], subject: string): GradeResult {
let totalScore = calcTotalScores(scores)
// Calcular el promedio redondeado a 1 decimal
let average = Math.round((totalScore / scores.length) * 10) / 10;
// Determinar la letra de calificación según el promedio
let grade = calcWordScore(average)
// Verificar si el estudiante aprobó
let passed = average >= SCORE_LOW;
// Calcular bono según la materia y el promedio
let bonus = calcBonus(subject,average)
return { average, grade, passed, bonus };
}0respuestas