Solución
solution.tsTypeScript
interface GradeResult {
average: number;
grade: ClassificationLetters;
passed: boolean;
bonus: number;
}
type ClassificationLetters = 'A' | 'B' | 'C' | 'D' | 'F'
type Subject = 'math' | 'science'
type BonusRule = {
threshold: number
bonus: number
}
const BONUS_MATH_THRESHOLD = 90
const BONUS_SCIENCE_THRESHOLD = 80
const BONUS_MATH_VALUE = 10
const BONUS_SCIENCE_VALUE = 5
const BONUS_RULES: Record<Subject, BonusRule> = {
'math': { threshold: BONUS_MATH_THRESHOLD, bonus: BONUS_MATH_VALUE },
'science': { threshold: BONUS_SCIENCE_THRESHOLD, bonus: BONUS_SCIENCE_VALUE }
}
type GradeRule = {
min: number,
letter: ClassificationLetters
}
const GRADE_A_THRESHOLD = 90
const GRADE_B_THRESHOLD = 80
const GRADE_C_THRESHOLD = 70
const GRADE_D_THRESHOLD = 60
const GRADE_RULES: GradeRule[] = [
{ min: GRADE_A_THRESHOLD, letter: "A" },
{ min: GRADE_B_THRESHOLD, letter: "B" },
{ min: GRADE_C_THRESHOLD, letter: "C" },
{ min: GRADE_D_THRESHOLD, letter: "D" },
]
const PASSING_SCORE = 60
export function processStudentGrades(grades: number[], subject: Subject): GradeResult {
const totalSum = getSumNumbers(grades)
const average = calculateRoundedAverage(totalSum, grades.length)
const grade = getClassificationLetterByAverage(average)
const passed = average >= PASSING_SCORE
const bonus = getBonusBySubject(average, subject)
return { average, grade, passed, bonus };
}
export function calculateRoundedAverage(sum: number, count: number): number {
const MULTIPLIER = 10
const totalAverage = Math.round((sum / count) * MULTIPLIER) / MULTIPLIER
return totalAverage
}
export function getSumNumbers(values: number[]): number {
return values.reduce((acc, value) => acc + value, 0)
}
export function getClassificationLetterByAverage(average: number): ClassificationLetters {
for (const rule of GRADE_RULES) {
const { min, letter } = rule
if (average >= min) return letter
}
return 'F'
}
export function getBonusBySubject(average: number, subject: Subject): number {
const rule = BONUS_RULES[subject]
if (!rule) return 0
return average >= rule.threshold ? rule.bonus : 0
}0respuestas