problem 28

Problem 28 - Project Euler

21 22 23 24 25
20  7  8  9 10
19  6  1  2 11
18  5  4  3 12
17 16 15 14 13

こういう風に正の整数を螺旋状に 1001×1001 のサイズまで並べていったとき対角線上にある数の合計を求める問題。

まず n (n>1) 週目の数字の並びを考えてみる。

n 週目の四角の一辺にある数は 2n-1 個で、最後の数は (2n-1)^2 だから、

それぞれの角の合計は

Σ{(2n-1)^2 - 2k(n-1)} (k = 0, 1, 2, 3)

になる。1001 = 2n - 1 を解くと n = 501 だから、もとめる数は n = 1 のとき 1 も付け加えて

1 + ΣΣ{(2n-1)^2 - 2k(n-1)} (k = 0, 1, 2, 3, n= 2...501)

これを scheme で実装。

(use srfi-1)

(define (p28)
  (fold (lambda (n y)
          (fold + y (map (lambda (x) (- (expt (- (* 2 n) 1) 2) (* x (- n 1))))
                          (iota 4 0 2))))
       1 (iota 500 2)))

(print (p28))