2016-08-08 126 views
2

我正在进行化学研究项目,我需要为各种角度创建文件。我想要以下的每种组合:多个阵列元素的组合

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 

预计产出将是“把文件名”其中,文件名是PHI1,PSI1,PHI2,PSI2的每个组合。我预计它会放324次,但它只做162次。

+0

不确定您的要求。你能添加你的预期输出吗? –

回答

3

您应该在这里使用Array#product

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 
0

我相信你想要这样的东西。你的问题是,当你这样做时,你重写了同一个数组中的值。

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 
+0

我不确定我看到我宣布他们两次。我宣布phi1和pSi1,然后phi2和PSi2。因为一个是phi,另一个是psi,我不应该在那里罚款吗? :S –

+0

你是对的,对不起,它看起来超类似,我错过了。我猜想什么是预期的和实际的产出。它看起来应该没问题 –

0

你为什么声明phi1phi2两次?我会做这样的事情:

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 

我希望这有助于。

+0

我不确定我是否理解我如何宣布他们两次。我宣布phi1和pSi1,然后phi2和PSi2。 –