I think this is a better (more agnostic & more declarative/functional) arbitrary partitioning. The ratio of true:false can be tweaked for longer average sequence length. (defn arbitrarily-partition [coll] (let [signals (take (count coll) (cycle [true false])) shuffled (shuffle signals) zipped (map vector shuffled coll) partitioned (partition-by first zipped)] (for [c partitioned] (map second c)))) ;;=> (arbitrarily-partition (range 100)) ((0 1) (2) (3) (4 5) (6 7) (8 9 10) (11) (12) (13 14 15) (16) (17 18) (19) (20) (21) (22 23 24 25 26) (27 28) (29) (30 31) (32) (33 34 35 36 37 38) (39 40 41) (42) (43 44 45 46 47) (48 49) (50) (51 52 53) (54) (55 56) (57 58) (59 60 61) (62) (63) (64) (65 66) (67 68) (69) (70) (71) (72 73 74 75) (76) (77 78) (79) (80) (81 82) (83 84 85) (86) (87 88) (89 90 91 92 93) (94) (95 96 97) (98) (99))
clojure.core, by purposeClojure String utilities It is poor form to (:use clojure.string).
This file defines a generic tree walker for Clojure data structures.
This file defines polymorphic I/O utility functions for Clojure.