grade_report.scala en Scala
Promedios por estudiante, notas en letra y un resumen del curso desde una lista en el código.
// A per-student grade report from an inline roster.
case class Student(name: String, scores: List[Int])
val roster: List[Student] = List(
Student("Ada Byron", List(92, 88, 100, 95)),
Student("Grace Hopper", List(78, 84, 80, 91)),
Student("Alan Turing", List(65, 72, 58, 70)),
Student("Katherine J.", List(99, 97, 94, 100)),
Student("Edsger D.", List(55, 61, 49, 64)),
)
def average(scores: List[Int]): Double =
if scores.isEmpty then 0.0 else scores.sum.toDouble / scores.size
// Guards turn one match into a ladder of thresholds, read top down,
// so the first case that fits wins.
def letter(avg: Double): String = avg match
case a if a >= 90 => "A"
case a if a >= 80 => "B"
case a if a >= 70 => "C"
case a if a >= 60 => "D"
case _ => "F"
@main def gradeReport(): Unit =
val graded = roster.map(s => (s, average(s.scores)))
// Best first, so the ranking is visible without reading averages.
val ranked = graded.sortBy((_, avg) => -avg)
println(f"${"student"}%-14s${"best"}%6s${"worst"}%6s${"avg"}%7s${"grade"}%7s")
println("-" * 40)
for (student, avg) <- ranked do
val best = student.scores.max
val worst = student.scores.min
println(f"${student.name}%-14s$best%6d$worst%6d$avg%7.1f${letter(avg)}%7s")
val classAvg = graded.map((_, avg) => avg).sum / graded.size
val passing = graded.count((_, avg) => avg >= 60)
println("-" * 40)
println(f"class average $classAvg%.1f (${letter(classAvg)})")
println(s"$passing of ${roster.size} students passing")
Cómo funciona
averagedividescores.sum.toDoubleentre la cantidad de puntajes.letterse lee como una escalera de umbrales con guardas comocase a if a >= 90.sortBy((_, avg) => -avg)pone al mejor primero, y${student.name}%-14srellena cada nombre a una columna fija.
Palabras clave y builtins usados aquí
caseclassdefdoelseforifmatchthenval
El intento, en números
- Líneas
- 41
- Caracteres a escribir
- 1469
- Tokens
- 388
- Ritmo de tres estrellas
- 75 tpm
Al ritmo de tres estrellas de 75 tokens por minuto, este intento toma unos 310 segundos.
Paso 2 de 3 en Bis; paso 26 de 27 en Fundamentos del lenguaje.