Удалить все подмножества в списке наборов - PullRequest
3 голосов
/ 17 ноября 2011

У меня есть список установленных элементов. Пример:

'([0 1 2][1 2 3] [4 5 6] [5 6 7] [0 1 2 3] [4 5 6 7])

Я хочу удалить подмножества - [0 1 2] [1 2 3] [4 5 6] [5 6 7] - и окончательный ответ должен быть '([0 1 2 3] [4 5 6 7]).

Любая помощь очень ценится.

Заранее спасибо.

Ответы [ 4 ]

6 голосов
/ 17 ноября 2011
(defn to-superset [ coll ]
  (loop [result () coll coll]
    (if (empty? coll) result
      (let  [x  (first coll)
             xs (rest coll)]
            (if (some #(clojure.set/subset? x %) xs) 
                (recur result xs)
                (recur (cons x result) xs))))))

(to-superset '(#{0 1 2} #{1 2 3} #{4 5 6} #{5 6 7} #{0 1 2 3} #{4 5 6 7}))

DEMO

user=> (to-superset '(#{0 1 2} #{1 2 3} #{4 5 6} #{5 6 7} #{0 1 2 3} #{4 5 6 7}))
(#{4 5 6 7} #{0 1 2 3})
2 голосов
/ 17 ноября 2011
(def set1 '([0 1 2][1 2 3] [4 5 6] [5 6 7] [0 1 2 3] [4 5 6 7]))

(def set2 '([0 1 2] [1 2 3] [4 5 6] [5 6 7]))

(remove (set set2) set1)

Результаты:

([0 1 2 3] [4 5 6 7])
1 голос
/ 17 ноября 2011

Это должно быть так же просто, как (Если вы не беспокоитесь о заказе)

(def a '( [1 2] [3 4] [5 6] ))
(def b '( [1 2] [33 34] [5 6] ))
(list* (set (conc­at a b)))
0 голосов
/ 17 ноября 2011
(apply list
       (difference
        (into #{}
              '([0 1 2] [1 2 3] [4 5 6] [5 6 7] [0 1 2 3] [4 5 6 7]))
        (into #{}
              '([0 1 2] [1 2 3] [4 5 6] [5 6 7]))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...