Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 获取N项数组的所有K项组合的最短代码,其中K<;=N_Arrays_Ruby_Algorithm_Combinations_Instance Eval - Fatal编程技术网

Arrays 获取N项数组的所有K项组合的最短代码,其中K<;=N

Arrays 获取N项数组的所有K项组合的最短代码,其中K<;=N,arrays,ruby,algorithm,combinations,instance-eval,Arrays,Ruby,Algorithm,Combinations,Instance Eval,获取N项数组的所有K项组合的最短方法是什么,其中K1个版本,希望它是正确的 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]] 一个版本,希望是正确的 x = [1, 2, 3] 1.upto(x.size).reduce([]) {

获取N项数组的所有K项组合的最短方法是什么,其中K1个版本,希望它是正确的

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]]

一个版本,希望是正确的

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]]

如果顺序/空列表无关紧要,下面是一个实现“电源设置”功能的简单而酷的方法:

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

如果顺序/空列表无关紧要,下面是一个实现“电源设置”功能的简单而酷的方法:

>>> [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]]

我会这样做:

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|
每个_与_索引。与_对象([]){(e,j),a | a[[],[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]] 
(2**arr.size).times.map do|i|
arr.each_with_index.with_object([]){|(e,j),a | 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]] 
arr=[1,2,3,4]
(2**arr.size).times.map do|i|
每个_与_索引。与_对象([]){(e,j),a | a[[],[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]] 
(2**arr.size).times.map do|i|
arr.each_with_index.with_object([]){|(e,j),a | 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]] 

[1,2,3]
分配给一个名字怎么样?比如
ari=[1,2,3]
然后
(1..ari.size).平面地图{i | ari.composition(i).to|a}
似乎很难理解为什么你关心“最短的”?代码长度不是很重要。@NiklasB.nice,应该是answer@muistooshort-我不太在乎-代码已经附带了1.'upto'(…方法…我只是想拓宽我的视野:)。将
[1,2,3]
分配给一个名称怎么样?比如
ari=[1,2,3]
然后
(1..ary.size)。平面图{I}ary.combination(I).to_a}
似乎很难理解为什么你关心“最短”?代码长度不是很重要。@NiklasB.nice,应该是一个answer@muistooshort-我不太在乎-代码已经附带了1.'upto'(…方法…我只是想拓宽我的视野:)。这不是生成组合的最有效方法:
[1,2,3,4].permutation(3).map(&:sort).uniq=[1,2,3,4].组合(3).to_a#=>true
@CarySwoveland,你说得对。我更喜欢niklas-b评论中的解决方案,但我后来读了。这也是一个简短的解决方案。这不是生成组合的最有效的方法:
[1,2,3,4]。permutation(3).map(&:sort).uniq=[1,2,3,4].合并(3)。对_a#=>true
@CarySwoveland,你说得对。我更喜欢niklas-b评论中的解决方案,但我后来读了。这也是一个简短的解决方案。谢谢…我知道你是怎么做的,逼我学了新东西的汉克斯…我知道你是怎么做的,逼我学了新东西的。让我为它的工作原理添加一条评论:it lo二进制中从
0
1111
的运算。如果
arr
的大小为6,则它是从
0
111111
,等等。然后它只检查位是0还是1,以决定是否包含该元素。例如,对于
1011
arr=[1,2,3,4]
,然后添加1、3、4,这样就成了
[1、3、4]
@太極者無極而生, 谢谢你的解释。我通常会提供一个;不知道为什么我没有在这里提供一个。让我为它的工作原理添加一个注释:它以二进制形式从
0
循环到
1111
。如果
arr
的大小是6,那么它是从
0
111111
,等等。然后它只需检查位是0还是1,以确定是什么以太包含该元素。例如,对于
1011
arr=[1,2,3,4]
,然后添加1,3,4,这使其成为
[1,3,4]
@太極者無極而生, 谢谢你的解释。我通常会提供一个;不知道为什么我没有在这里提供一个。