Project Euler: Problem35

昔の問題のコードを流用してるので、primes の使い方がちょっとおかしいような。"123"から["123","231","312"]を作る部分(begin-end-untilのとこ)は某 id:mallowlabs さんと少し話したのだけど、なんか普通の書き方になった。counter をインクリメントするところでこそこそと delete して候補の素数を減らしているのだけど、どれだけ効果があるのかはわからぬ。

class Problem35
  @@primes = {}
  def Problem35.calcPrime(last)
    (2...last).each {|n| @@primes[n.to_s] = n}
    (2...last).each {|n|
      c = n + n
      while c < last
        @@primes.delete(c.to_s)
        c += n
      end
    }
  end
  def Problem35.find()
    counter = 0

    @@primes.each {|prm,_|
      start = prm
      list = []
      begin
        list.push(prm)
        prm = rotate prm
      end until start == prm

      counter += list.length if list.all? {|x| @@primes.delete(x)}
    }
    return counter
  end
end
def rotate(str)
   str[1..-1] + str[0..0]
end

Problem35.calcPrime(1_000_000)
p Problem35.find()
ruby problem35.rb  31.45s user 0.19s system 99% cpu 31.810 total