Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。
問題
$d(n)$ を $n$ の真の約数の和と定義する. (真の約数とは $n$ 以外の約数のことである. )
もし, $d(a) = b$ かつ $d(b) = a$ ($a ≠ b$ のとき) を満たすとき, $a$ と $b$ は友愛数(親和数)であるという.
例えば, $220$ の約数は $1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110$ なので $d(220) = 284$ である.
また, $284$ の約数は $1, 2, 4, 71, 142$ なので $d(284) = 220$ である.
それでは$10000$未満の友愛数の和を求めよ.
解答
※実行には124秒ほどかかります。
seq 2 10000 |
awk '{for(i=1;i<=$1;i++){if(i==$1){print i""}else if($1%i==0){printf i" "}}}' |
awk '{for(i=1;i<=NF-1;i++){s[NR]+=$i};print s[NR],$NF,$NF,s[NR]}' |
xargs -n2 |
sort -n |
uniq -c |
awk '$1==2 && $2!=$3{s+=$2} END{print s}'
31626
等比数列の和の公式を使用する方法もあるが、実行時間があまり変わらない上にワンライナーが複雑になったのでやめた。
答え合わせ
こちらのサイト様と一致していればOKとした。
Project Euler 21 _ 友愛数 - PEをMathematicaで