word_freq.exs en Elixir
Una tabla de frecuencia de palabras armada por un pipeline: minúsculas, partir, contar, ordenar, graficar.
# Count word frequencies in a passage and chart the leaders.
passage = """
The rain in Maine falls mainly on the plain, and the plain is where
the rain in Maine stays. Rain finds the plain; the plain keeps the
rain. Maine weather, plainly, is mostly rain.
"""
top_n = 5
counts =
passage
|> String.downcase()
|> String.split(~r/[^a-z]+/, trim: true)
|> Enum.frequencies()
ranked =
counts
|> Enum.sort_by(fn {_word, n} -> -n end)
|> Enum.take(top_n)
widest =
ranked
|> Enum.map(fn {word, _n} -> String.length(word) end)
|> Enum.max()
IO.puts("#{map_size(counts)} distinct words")
IO.puts(String.pad_trailing("word", widest) <> " count bar")
for {word, n} <- ranked do
count = String.pad_leading(Integer.to_string(n), 5)
bar = String.duplicate("#", n)
IO.puts(String.pad_trailing(word, widest) <> " " <> count <> " " <> bar)
end
Cómo funciona
- El pasaje fluye por
String.downcase, unsplitcon regex yEnum.frequencies. Enum.sort_bysobre el conteo negado ordena las palabras;Enum.takese queda con las cinco primeras.pad_trailingypad_leadingcuadran las columnas yString.duplicatedibuja las barras.
Palabras clave y builtins usados aquí
doendfnfor
El intento, en números
- Líneas
- 33
- Caracteres a escribir
- 834
- Tokens
- 187
- Ritmo de tres estrellas
- 70 tpm
Al ritmo de tres estrellas de 70 tokens por minuto, este intento toma unos 160 segundos.
Paso 1 de 3 en Bis; paso 25 de 27 en Fundamentos del lenguaje.