获取其中 K <= N 的 N 项数组的所有 K 项组合的最短方法是什么?我设法写下以下内容:
> [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”?它似乎不是很优雅:\
获取其中 K <= N 的 N 项数组的所有 K 项组合的最短方法是什么?我设法写下以下内容:
> [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”?它似乎不是很优雅:\
如果订单/空列表无关紧要,这是实现“电源设置”功能的一种很酷的简短方法:
>>> [nil].product(*[1, 2, 3].map { |x| [nil, x] }).map(&:compact)
[[], [3], [2], [2, 3], [1], [1, 3], [1, 2], [1, 2, 3]]
我会做这样的事情:
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]]
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]]
一个版本,希望是正确的。
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]]