Solución
solution.tsTypeScript
interface GradeResult {
average: number;
grade: string;
passed: boolean;
bonus: number;
}
const PASSING_SCORE = 60
const GRADE_A_THRESHOLD = 90
const GRADE_B_THRESHOLD = 80
const GRADE_C_THRESHOLD = 70
const GRADE_D_THRESHOLD = 60
const MATH_BONUS_THRESHOLD = 90
const SCIENCE_BONUS_THRESHOLD = 80
const MATH_BONUS_POINTS = 10
const SCIENCE_BONUS_POINTS = 5
const BONUS_RULES = [
{ subject: 'math', threshold: MATH_BONUS_THRESHOLD, points: MATH_BONUS_POINTS },
{ subject: 'science', threshold: SCIENCE_BONUS_THRESHOLD, points: SCIENCE_BONUS_POINTS }
] as const
function calculateAverageGrade(grades: number[]): number {
let sum = 0
for (const grade of grades) {
sum += grade
}
return Math.round((sum / grades.length) * 10) / 10
}
function getGrades(avg: number): string {
if (avg >= GRADE_A_THRESHOLD) return 'A'
if (avg >= GRADE_B_THRESHOLD) return 'B'
if (avg >= GRADE_C_THRESHOLD) return 'C'
if (avg >= GRADE_D_THRESHOLD) return 'D'
return 'F'
}
function hasPassed(avg: number): boolean {
return avg >= PASSING_SCORE
}
function getBonus(subject: string, avg: number): number {
const rule = BONUS_RULES.find(r => r.subject === subject)
if (!rule) return 0
return avg >= rule.threshold ? rule.points : 0
}
export function processStudentGrades(grades: number[], subject: string): GradeResult {
// Calcular el promedio redondeado a 1 decimal
let average = calculateAverageGrade(grades)
// Determinar la letra de calificación según el promedio
let grade = getGrades(average)
// Verificar si el estudiante aprobó
let passed = hasPassed(average);
// Calcular bono según la materia y el promedio
let bonus = getBonus(subject, average)
return { average: average, grade: grade, passed: passed, bonus: bonus };
}0respuestas