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