typestar

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

  1. Enum.map extrae las temperaturas; Enum.min, Enum.max y una división fijan la amplitud.
  2. bar escala cada día contra la amplitud y diff le pone signo a la distancia de la media.
  3. El bucle for acomoda cada fila en columnas; el pie cuenta los días sobre la media.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

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

← Anterior