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}