samskivert: Euler 044

20 July 2008

Problem 044:

object Euler44 extends Application {
  def pent (n :Int) = n*(3*n-1)/2
  val pents = Set() ++ List.range(1, 3000).map(pent)
  def find (a :Int, b :Int) :Int = {
    val pa = pent(a)
    val pb = pent(b)
    val d = pb-pa
    val s = pa+pb
    if (pents.contains(d) && pents.contains(s)) d
    else if (a >= b) find(1, b+1)
    else find(a+1, b)
  println(find(1, 2))

This one's not especially elegant or clever (but it is fast). We just scanning increasing pairs of integers for a pair that meets our criteria and stop when we find it. We optimize by generating a “sufficiently large" list of pentagonal numbers and putting them in a set so that we can quickly test a sum or difference for pentagonality.

©1999–2015 Michael Bayne