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は数式で交換可能であるため、2つの一致があり、2puts回出力されます。これを修正するために追加a >= bしましたが、出力されるのは1回だけです。ただし、a == b2回出力すると。私が使用している例では、aとbが常に異なることは知っていますが、これは私には悪い設計のように思えます。

2つの質問:

  1. 配列を取得してそれ自体と比較するためのより良いパターンがRubyにありますか?

  2. 常に2回出力されないようにするにはどうすればよいですか。次のループの開始前に変更すると発生する変数を設定できます。それはこれを行うための適切な方法ですか?

4

1 に答える 1

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

少し良い方法を使用するように編集 (配列の配列の最初と 2 番目の各ブロック)

于 2012-05-26T22:38:02.473 に答える