Solución

@bryancastro·14/7/2026TypeScript
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
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.