David Jagoe <[email protected]> writes:
Hi David,
> Thanks! I had a nasty feeling that it could be done in a one-liner
> using partition-by or something similar. But of course you need to be
> able to look at previous elements...
Here's a slightly shorter variant.
--8<---------------cut here---------------start------------->8---
(defn partition-distinct [c]
(reduce #(if (.contains (last %1) %2)
(conj %1 [%2])
(conj (subvec %1 0 (dec (count %1)))
(conj (last %1) %2)))
[[]] (vec c)))
--8<---------------cut here---------------end--------------->8---
The difference is that it'll always return a vector of vectors, and of
course the .contains-check is linear for vectors, so it's quadratic to
the size of `c` in total.
If you don't care about the order of elements in each partition, then
you can just go with a vector of sets and have the same performance as
Cedric's recursive solution.
--8<---------------cut here---------------start------------->8---
(defn partition-distinct [c]
(reduce #(if ((last %1) %2)
(conj %1 #{%2})
(conj (subvec %1 0 (dec (count %1)))
(conj (last %1) %2)))
[#{}] (vec c)))
--8<---------------cut here---------------end--------------->8---
Bye,
Tassilo
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
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