2012-05-26 26 views
2

這裏工作的每個元素是我在做什麼:如何採取一個數組,並互相元素

(1..999).each do |a| 
    (1..999).each do |b| 
     if Math.sqrt(a**2 + b**2) % 1 == 0 && a + b + Math.sqrt(a**2 + b**2) == 1000 && a >= b 
      puts a * b * Math.sqrt(a**2 + b**2) 
     end  
    end 
end 

正在發生的事情是,ab所以有兩場比賽,並在公式互換因此puts被輸出兩次。爲了解決這個問題,我加了a >= b,現在只輸出一次。但是,如果a == b它輸出兩次。我知道a和b在我使用的例子中總是不一樣,但這對我來說似乎是不好的設計。

兩個問題:

  1. 是否有紅寶石採取一個數組,並將其與它自己一個更好的模式?

  2. 我怎樣才能避免它輸出兩次總是。我可以設置一個變量,如果在下一個循環開始之前發生變化,就會發生變化。這是做到這一點的正確方法嗎?

+0

我認爲你有一個問題的唯一原因是,你使用的是預(與第一和第二的數組的數組每塊)定義的數字範圍。你會一直這樣嗎?如果數組內容不可預測,並且您希望每個組合之間的歐幾里得距離(看起來就是您正在尋找的),那麼您將不得不做這種計算。也許你可以使用[narray](http://stackoverflow.com/questions/5653994/ruby-equivalent-of-numpy)來抽象你的矩陣乘法? – KobeJohn

+0

@kobejohn這是歐拉項目的一部分(準確地說問題9)。但我認爲代碼並不像它那樣乾淨。想看看我能否改進一下。所以,是的,我知道它總是在1到999之間,但這不是爲了工業實力。 –

+0

我明白了。我錯了,我錯過了第1點:它實際上是相同的陣列。 austinbv的解決方案是一個很好的證明ruby的靈活性和可讀性,當正確完成! – KobeJohn

回答

5
#using combination 
(1..999).to_a.combination(2).each do |low, high| 
    if Math.sqrt(low**2 + high**2) % 1 == 0 && low + hight + Math.sqrt(low**2 + high**2) == 1000 
    puts low * high * Math.sqrt(low**2 + high**2) 
    end 
end 

編輯使用好一點的做法

+0

看起來你有一個小的格式問題。 –

+0

認爲我現在明白了 – austinbv

+0

謝謝,這就是我一直在尋找的。 –

相關問題