typestar

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

  1. maps:update_with incrementa con semilla para palabras nuevas.
  2. El fun de orden clasifica por conteo con empates alfabéticos.
  3. lists:duplicate(N, $#) dibuja la barra de cada palabra.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

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

← Anterior Siguiente →