引き続きProject Euler

引き続き Project Euler を解いています。
なんだか時間を浪費しているように思えてならないのですが、なぜか魅力があります。

Project Euler 30

http://odz.sakura.ne.jp/projecteuler/index.php?Problem%2030

この問題、単純に計算する範囲を絞るだけの問題なのですが、各桁の5乗和が大きいように思えて範囲を絞れることになかなか気づきませんでした。。。
冷静に考えると桁を1つ上げると、数字は10倍、各桁の5乗和は高々9^5の増加ですよね。数字が大きくなると、10倍の方が増加分が大きくなるということなんですよね。

数学が久しぶりすぎてこんな簡単なことに気づくのに時間がかかってしまいましたorz

各桁を配列化する

各桁の合計を求めたりするのに、各桁の配列化をよく行うのですが、今まで手抜きで

def digits(num)
  num.to_s.split("").map{|t|t.to_i}
end

としていました。
しかし、splitがあまりに遅すぎるため、普通に数値だけで求めることにしました。

def digits(num)
  res = []
  while num != 0
    res << num % 10
    num /= 10
  end
  return res
end

ちなみに、時間の違いを測定したところ、1000000回試行して、それぞれ 20s, 3s でした。
10倍くらいということであれば、劇的な速度向上というわけではないですね。ただ、コンソールの前で待つ時間が減ったというよい効果があります。