Как я могу проверить заданную сумму во всех комбинациях нескольких наборов? - PullRequest
3 голосов
/ 30 октября 2011

Я работаю над Проблема 131 с сайта 4Clojure.

Какой тип выражения «for» я мог бы добавить, чтобы комбинаторно проверить каждый из этих наборов на предмет подмножества элементов, сумма которых равна 0?

В частности, у меня было несколько вопросов здесь:

  1. Есть ли функция замыкания, которая принимает произвольное число множеств?

  2. Если это так, как я могу сгенерировать все подмножества И суммировать эти подмножества без добавления дополнительного Clojure к этому коду, или я ошибаюсь?

Мне нужно заполнить часть __.

(= true  (__ #{-1 1 99}
             #{-2 2 888}
             #{-3 3 7777}))

1 Ответ

4 голосов
/ 31 октября 2011
  1. Вы имеете в виду наборы (а не карты)? Но на самом деле это не имеет значения.
    Например, count принимает один аргумент, но вы можете сделать анонимную функцию, которая принимает произвольное количество аргументов.
    ((fn [& args] (map count args)) #{-1 1 99} #{-2 2 888} #{-3 3 7777})
    или
    (#(map count %&) #{-1 1 99} #{-2 2 888} #{-3 3 7777})

  2. Вы можете использовать подмножества из combinatorics contrib для генерации всех подмножеств и затем reduce их с помощью +
    #(map (partial reduce +) (subsets %))

Итак, эту проблему можно решить с помощью этих двух функций:

(defn sums [s] 
  (set (map #(reduce + %) (rest (subsets s)))))

(defn cmp [& sets]
  (not (empty? (apply intersection (map sums sets)))))

Мне не удалось 4clojure импортировать библиотеки из contrib, поэтому я оставил все как есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...