Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。
問題
五角数は $P_n = \frac{1}{2}n(3n-1)$ で生成される. 最初の$10$項は
$1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ...$
である.
$P_4 + P_7 = 22 + 70 = 92 = P8$ である. しかし差 $70 - 22 = 48$ は五角数ではない.
五角数のペア $P_j$ と $P_k$ について, 差と和が五角数になるものを考える. 差を $D = |P_k - P_j|$ と書く. 差 $D$ の最小値を求めよ.
アプローチ
$P_n = \frac{1}{2}n(3n-1)$を$n$について解くと、$n=\frac{1±\sqrt{1+24P_n}}{6}$となる。
$P_k±P_j$を計算した結果を上記に代入して整数になればよい。
解答
seq 9999 |
awk '{print $1*(3*$1-1)/2}' |
awk '{for(i=NR-1;1<=i;i--){v=i*(3*i-1)/2;p=$1+v;m=$1-v;if((1+sqrt(1+24*p))%6==0&&(1+sqrt(1+24*m))%6==0){print m;break}}}' |
sort -k1,1n |
head -1
5482660
seq 999
から始められればフィルタコマンド(といっても結局awk
)のつなぎ合わせで求められるが、seq 9999
からでないと求められないのでawk
で長ったらしく書いた。
awk
のfor
のbreak
大切!と思ったが、今回の場合はif
ではじかれているだけだった様子。
答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/044.html