On Sun, Apr 18, 2010 at 9:20 PM, verec <
jeanfrancois.brouil...@googlemail.com> wrote:

> I have two problems with the following code.
> First, I have this `tos' business (to-string) because:
> user=> (first "abc")
> \a
> user=> (rest "abc")
> (\b \c)
> Since I wanted to get strings out of strings, a character or a
> collection is no good.
>
> Second, I ended-up having to use a mutable atom `res' because I
> couldn't figure out how to do it otherwise.
>
> Any pointer on how to tackle either or both problems welcome.
>
> (ns word-play)
>
> (defn rotate
>  "Take a collection and left rotates it n steps.
>  If n is negative, the collection is rotated right.
>  Executes in O(n) time."
>  ([coll]
>    (rotate 1 coll))
>  ([n coll]
>    (let [c (count coll)]
>      (take c (drop (mod n c) (cycle coll))))))
>
> (defn all-rotations [word]
>  "all rots"
>  (take (count (str word)) (cycle (iterate rotate (str word)))))
>
> (defn anagram [word]
>  "To generate all anagrams of a given string of length n, the most
>  obvious solution is to consider all n rotations of the string one
>  by one, and for each such rotation, concatenate its first character
>  with each of the anagrams of the new string composed of all but its
>  first character."
>  (cond
>     (= (count word) 0) '("")
>     (= (count word) 1) (list word)
>     true
>      (let [all (all-rotations word)
>            tos #(str (reduce str %))
>            wst (map tos all)
>            res (atom "")]
>        (doseq [w wst]
>          (let [s (str w)
>                f (str (first (str s)))
>                n (str (tos (next (str s))))
>                j #(str f (tos %))
>                a (ana3 n)
>                r (map j a)]
>            (swap! res concat r)))
>        @res)))
>

You don't need an atom, look into loop/recur. Also, this can be done in two
lines with the combinatorics clojure-contrib library ;)

user=> (use 'clojure.contrib.combinatorics)
user=> (map #(apply str %) (permutations "lisp"))

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to