http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2049
time seq 1000 9999 | factor | awk 'NF==2{print $2}' | grep -v 0 | awk '{cmd="echo "$1"|sed \047s/./&\\n/g\047|sort|tr -d \047\\n\047";cmd|getline l;close(cmd);a[l]=a[l]" "$1}END{for(v in a){print v,a[v]}}' | awk 'NF>3' | awk '{for(i=2;i<=NF-2;i++){for(j=i+1;j<=NF-1;j++){for(k=j+1;k<=NF;k++){if(($j-$i)==($k-$j)){print $i$j$k}}}}}' |grep -v '^1487' 296962999629 real 0m4.007s user 0m1.380s sys 0m3.935s [nobuoki@4b22771af61a projecteuler][master *]$
まずまずかな
# 4桁の素数
seq 1000 9999 | factor | awk 'NF==2{print $2}' |
# 0を含む場合、並べ替えて3種類以上の素数にならないので除く(千の位、末尾に0の素数は無い)
grep -v 0 |
# 各桁を小さい順に並べた数値(文字列)グルーピング
awk '{cmd="echo "$1"|sed \047s/./&\\n/g\047|sort|tr -d \047\\n\047";cmd|getline l;close(cmd);a[l]=a[l]" "$1}
# グルーピング結果を表示
END{for(v in a){print v,a[v]}}' |
# 同じ文字を使って3つ以上の素数が存在するものだけ抽出
# 1列目がキーなので、それを除外すると、全体として4列以上のものを抽出
awk 'NF>3' |
# 等差数列のものを抽出
awk '{
for(i=2;i<=NF-2;i++){
for(j=i+1;j<=NF-1;j++){
for(k=j+1;k<=NF;k++){
if(($j-$i)==($k-$j)){
print $i$j$k
}
}
}
}
}' |
# 1487を含む等差数列を削除
grep -v '^1487'