查找从数组中抽取的所有数字的总和为16

the*_*ing 2 ruby arrays circular-permutations

我想从[2,3,4,5,6,7,8]中找到拔除3、4或5个数字的所有排列,允许重复,这样它们的总和为16。所以[8,5,3 ],[8,3,5]和[4,3,3,3,3]是有效的排列。同样,也应删除循环排列,以使[3,3,3,3,4]也不会添加到答案中。我可以在Ruby中执行此操作,而无需允许这样的重复:

d = [2,3,4,5,6,7,8]
number_of_divisions = [3,4,5]
number_of_divisions.collect do |n|
  d.permutation(n).to_a.reject do |p|
    p[0..n].inject(0) { |sum,x| sum + x } != 16
  end
end
Run Code Online (Sandbox Code Playgroud)

如何允许重复,以便包含[3,3,3,3,4]?

Ale*_*kin 5

对于所有排列,包括重复排列,可以使用Array#repeated_permutation

d = [2,3,4,5,6,7,8]
number_of_divisions = [3,4,5]
number_of_divisions.flat_map do |n|
  d.repeated_permutation(n).reject do |p| # no need `to_a`
    p.inject(:+) != 16
  end
end
Run Code Online (Sandbox Code Playgroud)

或者,甚至更好Array#repeated_combination

number_of_divisions.flat_map do |n|
  d.repeated_combination(n).reject do |p| # no need `to_a`
    p.inject(:+) != 16
  end
end
Run Code Online (Sandbox Code Playgroud)