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
pickpliega con un fun de comparación que llega de afuera.- El gráfico duplica $# contra la línea de congelamiento.
zipsobre la lista y su cola empareja las noches.
Palabras clave y builtins usados aquí
absbegincaseendfuniflengthoftltrunc
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.
Paso 3 de 3 en Bis; paso 31 de 31 en Fundamentos del lenguaje.