typestar

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

  1. El pasaje fluye por String.downcase, un split con regex y Enum.frequencies.
  2. Enum.sort_by sobre el conteo negado ordena las palabras; Enum.take se queda con las cinco primeras.
  3. pad_trailing y pad_leading cuadran las columnas y String.duplicate dibuja las barras.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 1 de 3 en Bis; paso 25 de 27 en Fundamentos del lenguaje.

← Anterior Siguiente →