20 lines
640 B
Clojure
20 lines
640 B
Clojure
(defn perms
|
|
"produce all the permutations of a finite sequence"
|
|
[ds]
|
|
(if (empty? ds)
|
|
[]
|
|
(let [rotseq (for [n (range (count ds))] (concat (drop n ds) (take n ds)))]
|
|
(reduce-with [rs [], [[d & ds]] rotseq]
|
|
(concat rs (if (empty? ds) [[d]] (map #(cons d %) (perms ds))))))))
|
|
|
|
(doseq [result results]
|
|
(let [seed (first result)
|
|
seeds (->> seed perms (map vec) set sort (remove (comp zero? first)))]
|
|
(apply println "Seed value(s):" (map #(apply str %) seeds)))))
|
|
(println)
|
|
(println "Iterations:" (count result))
|
|
(println)
|
|
(println "Sequence:")
|
|
(doseq [ds result]
|
|
(println (apply str ds))))
|