Project Euler 44

Project Euler 44はpentagonal numbersの問題。思い切り力技、かつ抽象度が高い感じ。コードは短く、ほぼ問題文をそのまま書いただけと分かりやすいけど、とにかく遅い。7、8分かかってやっと答えが出た。

直感的に最初に出てくるペアが最小だと思って、実際それで正解だったけど、厳密にそうが言えるのかどうかは、よく分からない。

def penta(n)
  n * (3 * n - 1) / 2
end

p = (1..3000).map{|i| penta(i)}

p.combination(2) do |pair|
  if (p.include?(pair[0] + pair[1]) &&
      p.include?(pair[1] - pair[0]) ) then
    p pair
  end
end