Project Euler: Problem45

昔書いたやつの BigInt 版。なんか一瞬で解けた。BigInt すごーい。

object Problem45 {
  class Generator (gen : BigInt => BigInt) extends Iterator[BigInt] {
    val this.gen = gen;
    var n = 0;
    def hasNext : Boolean = true;
    def next : BigInt = {
      n += 1;
      return gen(n);
    }
  }
  def main(args : Array[String]) : Unit = {
    var triangle = new Generator(n => n*(n+1)/2);
    var pentagonal = new Generator(n => n*(n*3-1)/2);
    var hexagonal = new Generator(n => n*(n*2-1));
    
    var x = triangle.next();
    var y = pentagonal.next();
    var z = hexagonal.next();
    while (true) {
      if (x==y && y==z)
        println(x);
      if (x < y) {
        if (x < z) x = triangle.next();
        else       z = hexagonal.next();
      } else {
        if (y < z) y = pentagonal.next();
        else       z = hexagonal.next();
      }
    }
  }
}