August 10, 2018

Sum Some Set Subsets

First we will generate the set of all subsets:

(defn powerset [s]
  (reduce #(into % (for [subset %] (conj subset %2)))
          #{#{}} s))

(powerset #{-1 1 99} #{-2 2 888} #{-3 3 7777})

However, we only want the non-empty ones:

(defn non-empty-subsets [sets]
  (map #(disj (powerset sets) #{}) sets))

(non-empty-subsets #{-1 1 99} #{-2 2 888} #{-3 3 7777})

From this we can generate the sum of each:

(defn sum-of-sets [sets]
  (set (map #(apply + %) sets)))

(map sum-of-sets
     (non-empty-subsets #{-1 1 99} #{-2 2 888} #{-3 3 7777}))

Now we check for matches:

(apply clojure.set/intersection
  (map sum-of-sets
    (non-empty-subsets #{-1 1 99} #{-2 2 888} #{-3 3 7777})))
Tags: coding exercises KLIPSE 4clojure Clojure