temp_stats.exs en Elixir
Una semana de máximas diarias reducida a mínima, máxima y media, con una barra a escala por día.
# One week of daily highs: spread, mean, and a scaled bar chart.
week = [
{"Mon", 61}, {"Tue", 68}, {"Wed", 74}, {"Thu", 79},
{"Fri", 72}, {"Sat", 65}, {"Sun", 58}
]
temps = Enum.map(week, fn {_day, t} -> t end)
lo = Enum.min(temps)
hi = Enum.max(temps)
mean = Enum.sum(temps) / length(temps)
span = max(hi - lo, 1)
# Bars scale to the week's spread; the +1 keeps the coolest day visible.
bar = fn t -> String.duplicate("#", 1 + div(20 * (t - lo), span)) end
diff = fn t ->
shown = Float.round(abs(t - mean), 1)
if t >= mean, do: "+#{shown}", else: "-#{shown}"
end
IO.puts("day high range diff")
IO.puts(String.duplicate("-", 40))
for {day, t} <- week do
IO.puts(
String.pad_trailing(day, 5) <>
String.pad_leading(Integer.to_string(t), 4) <> " " <>
String.pad_trailing(bar.(t), 21) <>
String.pad_leading(diff.(t), 5)
)
end
IO.puts(String.duplicate("-", 40))
IO.puts("low #{lo}, high #{hi}, mean #{Float.round(mean, 1)}")
IO.puts("days above the mean: #{Enum.count(temps, fn t -> t > mean end)}")
Cómo funciona
Enum.mapextrae las temperaturas;Enum.min,Enum.maxy una división fijan la amplitud.barescala cada día contra la amplitud ydiffle pone signo a la distancia de la media.- El bucle
foracomoda cada fila en columnas; el pie cuenta los días sobre la media.
Palabras clave y builtins usados aquí
doendfnforif
El intento, en números
- Líneas
- 35
- Caracteres a escribir
- 1022
- Tokens
- 344
- Ritmo de tres estrellas
- 70 tpm
Al ritmo de tres estrellas de 70 tokens por minuto, este intento toma unos 295 segundos.
Paso 3 de 3 en Bis; paso 27 de 27 en Fundamentos del lenguaje.