6

http://projecteuler.net/problem=1を解決しようとしています。

整数を受け取り、その前にあるすべての整数の配列と、配列内の値として整数自体を作成するメソッドを作成したいと思います。

以下は私がこれまでに持っているものです。コードが機能しません。

def make_array(num)
  numbers = Array.new num  
  count = 1

  numbers.each do |number|
    numbers << number = count
    count = count + 1
  end

  return numbers    
end

make_array(10)
4

2 に答える 2

10

(1..num).to_aRubyで行う必要があるのはこれだけです。

1..num開始点と終了点が何であれ、Rangeオブジェクトを作成します。オブジェクトには、範囲内の各要素を列挙することによって、オブジェクトを実際に爆破するメソッドがあります。1numRangeto_aArrays

ほとんどの場合、実際には必要ありませんArray-Range正常に動作します。これには反復が含まれます(これは、あなたが取り組んでいる問題を考えると、あなたが望むと私が想定していることです)。

とは言うものの、そのような「手作業」を作成する方法を知ることArrayは貴重な学習経験であるため、少し作業を続けたいと思うかもしれません。[]ヒント:代わりに空の配列()で開始しArray.new num、次に何かを繰り返してnum.times、に数値を追加する必要がありArrayます。すでにArrayサイズので開始し、要素をその中numにプッシュnumすると、2倍numの要素になります。場合のように、配列を反復処理しているときに要素を追加する場合、処理する要素ごとに別の要素を追加するため、ループが終了することはありません。磁石の反発側で金属球を追いかけるようなものです。

于 2013-01-07T05:58:50.223 に答える
2

オイラーの質問に答えるには:

(1 ... 1000).to_a.select{|x| x%3==0 || x%5==0}.reduce(:+) # => 233168

ワンライナーは、私が思うより詳細なコードよりも読みやすい場合があります。

ProjectEulerの例でRubyを学習していると仮定して、この行の機能を説明します。

(1 ... 1000).to_a

は、1から999までの数値の配列を作成します。オイラー質問では、1000未満の数値が必要です。範囲内で3つのドットを使用すると、境界値自体なしで配列が作成されます。

.select{|x| x%3==0 || x%5==0}

3または5で除算できる要素のみを選択するため、3または5の倍数を選択します。他の値は破棄されます。この操作の結果は、3または5の倍数のみを持つ新しい配列になります。

.reduce(:+)

最後に、この操作は、配列内のすべての数値を合計します(またはそれを1つの数値に減らします)。ソリューションに必要な合計です。

私が説明したいこと:あなたが毎日手で書くであろう多くのメソッドは、プログラマーからプログラマーのための言語であるため、すでにルビーに統合されています。実用的である;)

于 2013-01-08T10:01:49.220 に答える