Bash
ProjectEuler
数学

Project Euler Q28 【螺旋状に並んだ数の対角線】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。

問題

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$の螺旋を同じ方法で生成したとき, 対角線上の数字の和はいくつか?

解答

seq -s" " 2 $((1001**2)) |
awk '{for(i=1;i<=NF;i++){printf $i" ";if($i==int(sqrt($i))^2 && ($i-1)%8==0){print ""}}}' |
awk 'BEGIN{s=1}{for(i=1;i<=4;i++){s+=$(2*i*NR)}}END{print s}'
669171001

2個目のawkではそれぞれの週で何個目を取ればよいかを計算した結果、2*i*NRとなった。計算する前は2*(NR+(i-1)*NR)である。

答え合わせ

こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/028.html