Arrays 来自多个数组的元素的组合

Arrays 来自多个数组的元素的组合,arrays,ruby,Arrays,Ruby,我正在做一个化学研究项目,我需要为不同的角度创建文件。我想要以下各项的每一个组合: angle1 can be from [0, -36, -72, -108, -144, -180] angle2 can be from [-180, -108, -36] angle3 can be from [0, -36, -72, -108, -144, -180] angle4 can be from [-180, -108, -36] 我为此编写了一些Ruby代码,但它似乎只提供了预期组合数的一半

我正在做一个化学研究项目,我需要为不同的角度创建文件。我想要以下各项的每一个组合:

angle1 can be from [0, -36, -72, -108, -144, -180]
angle2 can be from [-180, -108, -36]
angle3 can be from [0, -36, -72, -108, -144, -180]
angle4 can be from [-180, -108, -36]
我为此编写了一些Ruby代码,但它似乎只提供了预期组合数的一半。我的编程技能不是很好,所以我想知道是否有人能告诉我我做错了什么

非常感谢您提供的任何帮助:

phi1 = [0, -36, -72, -108, -144, -180]
psi1 = [-180, -108, -36]

phi2 = [0, -36, -72, -108, -144, -180]
psi2 = [-180, -108, -36]

psi1.each do |a|
  psi2.each do |b|
    phi1.each do |c|
      psi2.each do |d|

        line1 = 'select' + "#{b}" + '}}'
        line2 = 'select' + "#{a}" + '}}'
        line3 = 'select' + "#{d}" + '}}'
        line4 = 'select' + "#{c}" + '}}'

        filename = "angles#{b}_#{a}_#{d}_#{c}"
        puts filename
        puts line1
        puts line2
        puts line3
        puts line4
      end
    end
  end
end

预期输出为“puts filename”,其中文件名为phi1、psi1、phi2、psi2的每个组合。我希望它能放324次,但它只能放162次。

我相信你想要这样的东西。您的问题是,您在执行时在同一数组中重写了值

phi1 = [0, -36, -72, -108, -144, -180]
psi1 = [-180, -108, -36]

phi2 = [0, -36, -72, -108, -144, -180]
psi2 = [-180, -108, -36]
如果您更改了第二个数组的名称以解决问题,我会键入我认为您需要的内容

phi1 = [0, -36, -72, -108, -144, -180]
psi3 = [-180, -108, -36]

phi2 = [0, -36, -72, -108, -144, -180]
psi4 = [-180, -108, -36]

psi1.each do |a|
  psi2.each do |b|
    phi3.each do |c|
      psi4.each do |d|

        line1 = 'select' + "#{b}" + '}}'
        line2 = 'select' + "#{a}" + '}}'
        line3 = 'select' + "#{d}" + '}}'
        line4 = 'select' + "#{c}" + '}}'

        filename = "angles#{b}_#{a}_#{d}_#{c}"
        puts filename
        puts line1
        puts line2
        puts line3
        puts line4
     end
    end
  end
end

为什么要两次声明
phi1
phi2
?我会这样做:

phi1 = [0, -36, -72, -108, -144, -180]

phi2 = [-180, -108, -36]

phi3 = [0, -36, -72, -108, -144, -180] # this one now ends in 3

phi4 = [-180, -108, -36] # this one now ends in 4

# I declared a new, unique array for every set of possible 
# angle values

phi1.each do |a|
  phi2.each do |b|
    phi3.each do |c|
      phi4.each do |d| #I also made it so the for loops are for each individual phi 
                       #array.

        line1 = 'select' + "#{b}" + '}}'
        line2 = 'select' + "#{a}" + '}}'
        line3 = 'select' + "#{d}" + '}}'
        line4 = 'select' + "#{c}" + '}}'

        filename = "angles#{b}_#{a}_#{d}_#{c}"
        puts filename
        puts line1
        puts line2
        puts line3
        puts line4
      end
    end
  end
end
我希望这有帮助

您应该在这里使用


我不确定你的要求。您可以添加预期的输出吗?我不确定我是否理解如何两次声明它们。我先声明phi1和pSi1,然后是phi2和PSi2。我不确定我是否看到我声明了两次。我要声明phi1和pSi1,然后是phi2和PSi2。既然一个是phi,另一个是psi,我在那里不是很好吗你是对的,很抱歉,它看起来非常相似,我错过了。我猜预期和实际产出是多少。看起来应该没问题
phi1 = [0, -36, -72, -108, -144, -180]
psi1 = [-180, -108, -36]
phi2 = [0, -36, -72, -108, -144, -180]
psi2 = [-180, -108, -36]

phi1.product(psi1, phi2, psi2).each do |arr|
  puts "angles#{ arr.join("_") }"
  arr.each { |angle| puts "select #{angle}" }
end

angles0_-180_0_-180
select 0
select -180
select 0
select -180
angles0_-180_0_-108
select 0
select -180
select 0
select -108
...
angles-180_-36_-180_-108
select -180
select -36
select -180
select -108
angles-180_-36_-180_-36
select -180
select -36
select -180
select -36

phi1.product(psi1, phi2, psi2).count
  #=> 324