Mae向きなブログ

Mae向きな情報発信を続けていきたいと思います。

「《ピッグデータ》に負けないで!」解けず…

CodeIQの「挑戦者求む!【ウチに来ない?】《ピッグデータ》に負けないで! by The Essence of Programming」に挑戦していたのですが、結局、解けずに時間切れでした…。
小さいデータでは解けるのに、大きい(ピッグ)データになると、実行時間がかかりすぎるということは、工夫が足りないんでしょうね。
以下は、問題をそのまま書き下した解けないサンプルです…。

pigdata.rb

# -*- coding: utf-8 -*-
require 'digest/sha1'

def getdata(index)
  q, r = index.divmod(10)
  sha1 = Digest::SHA1.hexdigest(q.to_s)
  d = sha1.unpack("a2" * (sha1.length/2)).map(&:hex)
  d[2*r] * 256 + d[2*r+1]
end

def getsign(count, skips)
  ret = 0
  sorted = [*0...count].map{|n| getdata(n) }.sort
  0.step(count - 1, skips) {|idx|
    ret += sorted[idx]
  }
  ret
end

# 小さいデータだと計算出来ますが、
p getsign(100, 10)
# ピッグデータになると…。
# p getsign(107374182400, 1677721)