Найти набор общих элементов из многомерного массива рекурсивно - PullRequest
2 голосов
/ 06 апреля 2010

У меня есть многомерный массив:

a=[[2,3,4],[1,3,4],[1,2],[1,2,3,4]]

Мне нужно сравнить все 4 подмассива и получить общие элементы. Далее, взять 3 подмассива за раз и получить общие элементы. Затем взять 2 под массива за раз и получить общие элементы в рублях.

1 Ответ

3 голосов
/ 06 апреля 2010

Это должно делать работу в последних версиях Ruby:

a.length.downto(1).map{|i| a.combination(i).map{|sub| sub.inject(&:&)}}
#=> [[[]], [[], [3, 4], [2], [1]], [[3, 4], [2], [2, 3, 4], [1], [1, 3, 4], [1, 2]], [[2, 3, 4], [1, 3, 4], [1, 2], [1, 2, 3, 4]]]

Вот связанный вопрос с аналогичным решением. «Хитрость» заключается в методе Array#&, который вычисляет пересечение (как заданную операцию) двух массивов. Это ассоциативная операция, поэтому мы можем применить ее к каждому подмассиву по очереди, сохраняя накопленный результат, поэтому inject идеально подходит для него. Вкратце, array.inject(&:&) приведет к наибольшему общему подмножеству элементов в каждом элементе array. &:& - это просто сокращение Ruby для создания Proc из метода с именем & и отправки его в виде блока в inject вместо записи:

array.inject{|a,e| a & e}
...