获得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”?它似乎不是很优雅:\
答案 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]]