typestar

temp_stats.erl en Erlang

Una semana de temperaturas: extremo por pliegue, barras, saltos.

%% Summarize a week of temperature readings: extremes, mean, swings.

readings() ->
    [{"Mon", -4.0}, {"Tue", -1.5}, {"Wed", 2.0}, {"Thu", 3.5},
     {"Fri", 1.0}, {"Sat", -2.5}, {"Sun", -6.0}].

main(_) ->
    Readings = readings(),
    Temps = [T || {_, T} <- Readings],

    {ColdDay, ColdT} = pick(fun erlang:'<'/2, Readings),
    {WarmDay, WarmT} = pick(fun erlang:'>'/2, Readings),
    io:format("Coldest: ~s at ~.1f C~n", [ColdDay, ColdT]),
    io:format("Warmest: ~s at ~.1f C~n", [WarmDay, WarmT]),
    io:format("Mean: ~.1f C~n", [lists:sum(Temps) / length(Temps)]),

    %% Chart each day against the freezing line.
    [begin
         Len = max(1, trunc(T + 7)),
         Side = if T > 0 -> "above"; true -> "below" end,
         io:format("~-4s ~5.1f ~s ~s~n",
                   [Day, T, lists:duplicate(Len, $#), Side])
     end || {Day, T} <- Readings],

    %% Pair each temperature with its successor for the swings.
    Swings = [abs(B - A)
              || {A, B} <- lists:zip(lists:droplast(Temps),
                                     tl(Temps))],
    io:format("Sharpest overnight swing: ~.1f C~n",
              [lists:max(Swings)]).

pick(Cmp, [First | Rest]) ->
    lists:foldl(fun({_, T} = E, {_, Best} = Acc) ->
        case Cmp(T, Best) of true -> E; false -> Acc end
    end, First, Rest).

Cómo funciona

  1. pick pliega con un fun de comparación que llega de afuera.
  2. El gráfico duplica $# contra la línea de congelamiento.
  3. zip sobre la lista y su cola empareja las noches.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
35
Caracteres a escribir
1132
Tokens
411
Ritmo de tres estrellas
55 tpm

Al ritmo de tres estrellas de 55 tokens por minuto, este intento toma unos 448 segundos.

Escribe este fragmento

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

← Anterior