word_freq.erl en Erlang
Una tabla de frecuencias con lexemes, maps:update_with y un orden.
%% Count word frequencies in a passage and chart the leaders.
passage() ->
"the rain in maine falls mainly on the plain and "
++ "the rain stays on the plain".
main(_) ->
Words = string:lexemes(passage(), " "),
%% Tally into a map; the default arm seeds new words at zero.
Counts = lists:foldl(
fun(W, Acc) -> maps:update_with(W, fun(N) -> N + 1 end, 1, Acc)
end, #{}, Words),
%% Rank: count descending, ties broken by the word itself.
Ranked = lists:sort(
fun({W1, N1}, {W2, N2}) ->
if N1 =/= N2 -> N1 > N2;
true -> W1 =< W2
end
end, maps:to_list(Counts)),
io:format("~p distinct words~n", [length(Ranked)]),
io:format("word ct bar~n"),
[io:format("~-7s ~2B ~s~n", [W, N, lists:duplicate(N, $#)])
|| {W, N} <- Ranked],
ok.
Cómo funciona
maps:update_withincrementa con semilla para palabras nuevas.- El fun de orden clasifica por conteo con empates alfabéticos.
lists:duplicate(N, $#)dibuja la barra de cada palabra.
Palabras clave y builtins usados aquí
endfuniflength
El intento, en números
- Líneas
- 27
- Caracteres a escribir
- 731
- Tokens
- 198
- Ritmo de tres estrellas
- 55 tpm
Al ritmo de tres estrellas de 55 tokens por minuto, este intento toma unos 216 segundos.
Paso 1 de 3 en Bis; paso 29 de 31 en Fundamentos del lenguaje.