2016-08-08 4 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] 

내가 이것에 대한 약간의 루비 코드를 작성하지만, 나에게 기대 조합의 수의 절반을주는 것으로 나타납니다 : 나는 다음의 모든 조합을합니다. 내 프로그래밍 기술은 훌륭하지 않아, 내가 잘못한 것을 누군가가 말해 줄 수 있는지 궁금해하고 있었다.

당신이 제공 할 수있는 당신에게 어떤 도움 주셔서 너무 감사합니다

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를 선언합니다. –