给定一个大小为y的数组,包含大小为n的数组,如何使用Ruby返回所有逻辑组合?

Bri*_*ear 6 ruby arrays

我想要做的是处理n组,而我下面提供的代码恰好适用于4组.

def show_combinations
  @combos = []
  ['A', 'no A'].each do |a|
    ['B', 'no B'].each do |b|
      ['C', 'no C'].each do |c|
        ['D', 'no D'].each do |d|
          @combos << [a, b, c, d]
        end
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我如何重构以下代码来处理以下场景:鉴于我有一个大小为y的数组包含大小为n的数组,我想返回所有组合.重要的是要注意每个子数组中只有一个项目可以在结果中.(例如"已完成的配置文件"也不能出现在"未完成配置文件"的结果中)

背景:

用户可能有一些任务:例如,"完成配置文件"或"设置电子邮件"等等.这些任务可以表示如下:

@task_states = [["Completed Profile, NOT Completed Profile"], ["Set up Email", "NOT set up Email"]]
Run Code Online (Sandbox Code Playgroud)

然后,将@task_states传递给方法,结果应为:

[
["Completed Profile", "Set up Email"],
["Completed Profile", "NOT set up Email"],
["NOT Completed Profile", "Set up Email"],
["NOT Completed Profile", "NOT Set up Email"]
]
Run Code Online (Sandbox Code Playgroud)

所以表示所有组合的数组数组.显然,"已完成的配置文件"也不能与"未完成的配置文件"等在同一个数组中.

谢谢!

Jör*_*tag 9

看起来你想要计算数组的笛卡尔积.计算笛卡尔积的方法(不太令人惊讶)称为Array#product:

@task_states.first.product(*@task_states.drop(1))
Run Code Online (Sandbox Code Playgroud)

所以,例如:

['A', 'no A'].product(['B', 'no B'], ['C', 'no C'], ['D', 'no D'])
#=> [[   "A",    "B",    "C",    "D"],
#    [   "A",    "B",    "C", "no D"],
#    [   "A",    "B", "no C",    "D"],
#    [   "A",    "B", "no C", "no D"],
#    [   "A", "no B",    "C",    "D"],
#    [   "A", "no B",    "C", "no D"],
#    [   "A", "no B", "no C",    "D"],
#    [   "A", "no B", "no C", "no D"],
#    ["no A",    "B",    "C",    "D"],
#    ["no A",    "B",    "C", "no D"],
#    ["no A",    "B", "no C",    "D"],
#    ["no A",    "B", "no C", "no D"],
#    ["no A", "no B",    "C",    "D"],
#    ["no A", "no B",    "C", "no D"],
#    ["no A", "no B", "no C",    "D"],
#    ["no A", "no B", "no C", "no D"]]
Run Code Online (Sandbox Code Playgroud)