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
Grade.letterson cuatro cláusulas con guarda, una por banda de calificación.rowredondea cada promedio y acomoda nombre, número y letra en columnas.Enum.flat_mapjunta todos los quizzes para que el promedio del curso cuente cada uno bajo la regla.
Palabras clave y builtins usados aquí
defdefmoduledoendfnfor
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.
Paso 2 de 3 en Bis; paso 26 de 27 en Fundamentos del lenguaje.