typestar

grade_report.exs en Elixir

Los puntajes de quiz se pliegan en promedios y calificaciones, y luego en un reporte formateado.

# Average quiz scores into letter grades and print the class report.
defmodule Grade do
  def letter(avg) when avg >= 90, do: "A"
  def letter(avg) when avg >= 80, do: "B"
  def letter(avg) when avg >= 70, do: "C"
  def letter(_avg), do: "retake"

  def average(scores), do: Enum.sum(scores) / length(scores)

  def row(name, scores) do
    avg = average(scores)
    shown = avg |> Float.round(1) |> Float.to_string()

    String.pad_trailing(name, 9) <>
      String.pad_leading(shown, 6) <> "  " <> letter(avg)
  end
end

roster = [
  {"Imani", [92, 88, 95]},
  {"Theo", [78, 83, 80]},
  {"Sofia", [85, 91, 89]},
  {"Miles", [62, 70, 68]}
]

IO.puts(String.pad_trailing("student", 9) <> "   avg  grade")
IO.puts(String.duplicate("-", 24))

for {name, scores} <- roster do
  IO.puts(Grade.row(name, scores))
end

every_score = Enum.flat_map(roster, fn {_name, scores} -> scores end)
class_avg = Enum.sum(every_score) / length(every_score)

IO.puts(String.duplicate("-", 24))
IO.puts("class average: #{Float.round(class_avg, 1)}")
IO.puts("quizzes graded: #{length(every_score)}")

Cómo funciona

  1. Grade.letter son cuatro cláusulas con guarda, una por banda de calificación.
  2. row redondea cada promedio y acomoda nombre, número y letra en columnas.
  3. Enum.flat_map junta todos los quizzes para que el promedio del curso cuente cada uno bajo la regla.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
38
Caracteres a escribir
1038
Tokens
330
Ritmo de tres estrellas
75 tpm

Al ritmo de tres estrellas de 75 tokens por minuto, este intento toma unos 264 segundos.

Escribe este fragmento

Paso 2 de 3 en Bis; paso 26 de 27 en Fundamentos del lenguaje.

← Anterior Siguiente →