Solución

@kappa_cat·2/6/2026TypeScript
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
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.