2

次の配列を生成するためのいくつかの異なる方法を考えました。[1, 10, 100, 1_000, 10_000, 100_000, 1_000_000]

この配列をstep関数でエレガントな方法で生成することは可能かもしれないようですが、私はそれを理解することができませんでした. 関数に 2 番目の引数を渡しstep、最後の値の 10 倍が必要だと言うもの:

0.step(1_000_000, ???).to_a

これまでに私が思いついた解決策は次のとおりです。

上限としてinject指定することを好むため、ソリューションはあまり好きではありません。1_000_000

(0..6).inject([]) { |memo, number| memo << 10**number; memo }

stepこれは私が思いついた醜い解決策です:

result = []
0.step(6) {|number| result << 10 ** number}
result

ループも適切でwhileはありませんが、少なくとも (Math.log10(upper_bound) の代わりに) upper_bound を指定できます。

result = [1]
while result.last < 1_000_000
  result << result.last * 10
end
result

助けてくれてありがとう。

4

3 に答える 3

7

あなたには多くの解決策がありました。こんな使い方はいかがでしょうmap

7.times.map { |i| 10**i }
#=> [1, 10, 100, 1000, 10000, 100000, 1000000]

上限を設定したい場合は、常に次のようにすることができます

1_000_000.to_s.size.times.map { |i| 10**i }
#=> [1, 10, 100, 1000, 10000, 100000, 1000000]
于 2013-07-24T00:40:23.777 に答える
0
class Integer

  def powers_upto(max)
    results = []
    exp = 0

    loop do
      result = self**exp
      break if result > max
      results << result
      exp += 1
    end

    results
  end

end



p 10.powers_upto(1_000_000)
p 2.powers_upto(11)

--output:--
[1, 10, 100, 1000, 10000, 100000, 1000000]
[1, 2, 4, 8]
于 2013-07-24T03:44:48.900 に答える