My version:
(defn top-words [input-filename result-filename]
(spit result-filename
(apply str
(map #(format "%s : %d\n" (first %) (second %))
(sort-by #(-(val %))
(reduce #(conj %1 { %2 (inc (%1 %2 0)) }) {}
(map #(.toLowerCase %)
(re-seq #"\w+"
(slurp input-filename)))))))))
Mibu
On Dec 25, 2:16 pm, Piotr 'Qertoip' Włodarek <[email protected]>
wrote:
> Given the input text file, the program should write to disk a ranking
> of words sorted by frequency, like:
>
> the : 52483
> and : 32558
> of : 23477
> a : 22486
> to : 21993
>
> My first implementation:
>
> (defn topwords [in-filepath, out-filepath]
> (def words (.split (.toLowerCase (slurp in-filepath)) "\\s+"))
>
> (spit out-filepath
> (apply str
> (concat
> (map (fn [pair] (format "%20s : %5d \r\n" (key pair)
> (val pair)))
> (sort-by #( -(val %) )
> (reduce
> (fn [counted-words word]
> ( assoc counted-words
> word
> (inc (get counted-words
> word 0)) ))
> {}
> words)))
> ["\r\n"]))))
>
> Somehow I feel it's far from optimal. Could you please advise and
> improve? What is the best, idiomatic implementation of this simple
> problem?
>
> regards,
> Piotrek
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---