ScalaでProject Euler(47)

Problem 28

座標と値のタプルからその次の対角線上の座標と値のタプルを得る関数を作れば簡単です。あとはIterator#iterateを使うだけです。

// (0, 0, 1) -> (1, -1, 3) -> (-1, -1, 5) -> (-1, 1, 7)
def next(s :(Int,Int,Int)) = s match {
    case (x, y, n) if x > 0 && y < 0 => (-x, y, n + x * 2)
    case (x, y, n) if x < 0 && y < 0 => (x, -y, n - x * 2)
    case (x, y, n) if x < 0          => (-x, y, n - x * 2)
    case (x, y, n)                   => (x + 1, -y - 1, n + x * 2 + 2)
}

val N = 1001
val M = N / 2
val it = Iterator.iterate((0, 0, 1))(next)
println (it.takeWhile(M >= _._1).map(_._3).sum)