Clojureで連番リストの歯抜け取得

古い記事ですが、ちょっと面白い問題なのでやってみた。=> 連番リストの歯抜け

■(partition 2 1) って便利
(defn pick-toothless [coll]
  (->> coll
       (partition 2 1)
       (remove #(= -1 (apply - %)))
       (mapcat (fn [[a b]] (range (inc a) b)))))
(pick-toothless '(1 2 3 5 6 8 9))  ;=> (4 7)
(pick-toothless '(1 2 4 5 10))     ;=> (3 6 7 8 9)
■差集合
(use '[clojure.set :only (difference)])
(defn pick-toothless [coll]
  (let [[mn mx] ((juxt first last) coll)]
    (difference (set (range mn (inc mx)))
                (set coll))))
(pick-toothless '(1 2 3 5 6 8 9))  ;=> #{4 7}
(pick-toothless '(1 2 4 5 10))     ;=> #{3 6 7 8 9}