Problem 28 「螺旋状に並んだ数の対角線」 †



1から初めて右方向に進み時計回りに数字を増やしていき, 5×5の螺旋が以下のように生成される:

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
両対角線上の数字の合計は101であることが確かめられる.

1001×1001の螺旋を同じ方法で生成したとき, 対角線上の数字の和はいくつか?



解法
4つ角単位で計算します。
最初の1はスペシャルケース。
そのあとは右下角を基準に、左下角=右下+枠のサイズ-1、左上角=右下+(枠のサイズ-1)*2 右上角=右下+(枠のサイズ-1)*3
となります。
右下角のさらに斜め右下は(枠サイズ-1)*3+(枠サイズ+1)で逐次的に計算できます。


calc(1003,_,Sum,Sum):-!.
calc(Size,Num,Sum,Result):-
 	Sum1 is Sum+Num*4+(Size-1)*6,
	NextNum is Num+(Size-1)*3+(Size+1),
	Size1 is Size+2,
	calc(Size1,NextNum,Sum1,Result).
main28:-
	calc(3,3,1,Ans),
	write(Ans).