Solución

@isakidev·1/5/2026TypeScript
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
Respuestas

Aún no hay respuestas

¡Sé el primero en responder!

Escribir un comentario

Recuerda ser amable. Estás comentando la solución de otra persona. Comparte tu perspectiva de forma constructiva y respetuosa.

Debes iniciar sesión para publicar un comentario.