問題(和訳)

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'

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-03-24 (日) 07:44:02