最終更新: 2011-02-09T20:16+0900
時間がかかるので逐一進捗を表示してる。この問題に魔法の一手なんてあるのかね。
primes = []
is_prime = lambda{|x|
result = true
primes.each{|prime|
quotient, remainder = x.divmod(prime)
if remainder == 0
result = false
break
end
break if quotient < prime
}
return result
}
2.upto(999_999){|x|
primes.push x if is_prime.call x
}
puts "#{primes.size} primes under 1 million."
work = primes.dup
step = 0
primes_found = []
live_elements = work.size
while 0 < live_elements
step += 1
primes_found.clear
live_elements = 0
print "step #{step}\r"
0.upto(work.size-1-step){|i|
work[i] += primes[i+step]
if work[i] < 1_000_000
live_elements += 1
primes_found.push work[i] if is_prime.call work[i]
end
}
if primes_found.empty?
elsif primes_found.size < 10
puts "step #{step}: #{primes_found.join ' '}"
else
puts "step #{step}: #{primes_found.size} primes"
end
end
魔法の一手はなくても……
答えを出した後でググるのが楽しい。フォーラムは読んでないけど、多分これ以上ないっていうような答えが書いてありそうで、面白くなさそうな気がしてる。(理解できない数学的知識が使われてたら、print XXXXXXX(answer); って書かれてるのと変わらないから)