frequencies y group-by en Clojure
Conteo de palabras con frequencies y paradas de metro agrupadas por group-by.
(require '[clojure.string :as str])
(def notice "the tide is out the boats are out the gulls are loud")
;; frequencies counts occurrences and returns a map of item to count
(def word-counts (frequencies (str/split notice #"\s+")))
(println (get word-counts "the") (get word-counts "out"))
(def stops [{:stop "Wharf" :line "A"} {:stop "Mill" :line "B"}
{:stop "Quay" :line "A"} {:stop "Ash" :line "C"}])
;; group-by builds a map from key fn result to a vector of the matches
(def by-line (group-by :line stops))
(println (map :stop (get by-line "A")))
;; group sizes are group-by plus a walk over the values
(println (reduce-kv (fn [m k v] (assoc m k (count v))) {} by-line))
Cómo funciona
(frequencies (str/split notice #"\s+"))cuenta cada palabra en un mapa de elemento a conteo.(group-by :line stops)devuelve un mapa del nombre de línea al vector de paradas que coinciden.reduce-kvrecorreby-liney cambia cada vector por sucount.
Palabras clave y builtins usados aquí
assoccountdeffngetmapprintln
El intento, en números
- Líneas
- 17
- Caracteres a escribir
- 679
- Tokens
- 120
- Ritmo de tres estrellas
- 70 tpm
Al ritmo de tres estrellas de 70 tokens por minuto, este intento toma unos 103 segundos.
Paso 1 de 3 en Herramientas de seq; paso 16 de 27 en Fundamentos del lenguaje.