用于获得N项阵列的所有K项组合的最短代码,其中K <= N.

时间:2015-07-14 20:22:45

标签: arrays ruby algorithm combinations instance-eval

获得N项数组的所有K项组合的最短方法是什么,其中K <= N?我设法写下以下一个:

 > [1,2,3].instance_eval "(1..size).flat_map {|i| self.combination(i).to_a }"

=> [[1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]

任何想法如何摆脱“instance_eval”?它似乎不是很优雅:\

4 个答案:

答案 0 :(得分:2)

这是一种很酷,很短的方式来实现一个&#34;电源组&#34;功能,如果订单/空列表不重要:

>>> [nil].product(*[1, 2, 3].map { |x| [nil, x] }).map(&:compact)
[[], [3], [2], [2, 3], [1], [1, 3], [1, 2], [1, 2, 3]]

答案 1 :(得分:2)

我会做这样的事情:

x = [1,2,3]
1.upto(x.size).flat_map { |i| x.combination(i).to_a }
#=> [[1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]

答案 2 :(得分:0)

一个版本,希望它是正确的。

x = [1, 2, 3]
1.upto(x.size).reduce([]) { |a, i| a + x.permutation(i).map(&:sort).uniq.to_a }
# => [[1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]

答案 3 :(得分:0)

arr = [1,2,3,4]

(2**arr.size).times.map do |i|
  arr.each_with_index.with_object([]) { |(e,j),a| a << e if i[j] == 1 }
end
  #=> [[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3], [4], [1, 4],
  # [2, 4], [1, 2, 4], [3, 4], [1, 3, 4], [2, 3, 4], [1, 2, 3, 4]]

当然,您可以根据需要对返回的数组进行排序。例如:

(2**arr.size).times.map do |i|
  arr.each_with_index.with_object([]) { |(e,j),a| a << e if i[j] == 1 }
end.sort_by { |a| [a.size,a] }
  #=> [[],
  #    [1], [2], [3], [4],
  #    [1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4],
  #    [1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4],
  #    [1, 2, 3, 4]]