【自習】「第53回シェル芸勉強会」の解答例

[A1]

# 準備
$ seq 1000000 | shuf > a
$ cat a
715429
289901
42724
748029
822545
483951
57404
197320
955890
123675
(...略...)
# 解答
$ paste a <(awk 'NR>5' a) | awk 'NF==2{print $1,$1+$2}'
715429 1199380
289901 347305
42724 240044
748029 1703919
822545 946220
483951 1142163
57404 589665
197320 879203
955890 1430006
123675 1037937
(...略...)

[A2]

$ cat frac
3240933263267302464930 518871903074343
$ cat frac | tr ' ' '/' | gp -fq | tr '/' ' '
568396410 91

[A3]

$ cat nums
-0.327
2.33333
4.0000000000999995
$ cat nums | awk '{printf "%." ($1<0?length($1)-4:length($1)-3) "g\n",$1}'
-0.33
2.333
4.0000000001

[A4]

# 3回実行した結果、いずれも6174に収束
$ seq 0 9 | shuf | awk 'NR<5{printf $1}' | perl -nlE 'while($A!=$_){$A=$_;$B=join("",sort{$b<=>$a}/(.)/g);$C=join("",sort{$a<=>$b}/(.)/g);$_=$B-$C;say}'
7173
6354
3087
8352
6174
6174
$ seq 0 9 | shuf | awk 'NR<5{printf $1}' | perl -nlE 'while($A!=$_){$A=$_;$B=join("",sort{$b<=>$a}/(.)/g);$C=join("",sort{$a<=>$b}/(.)/g);$_=$B-$C;say}'
9351
8172
7443
3996
6264
4176
6174
6174
$ seq 0 9 | shuf | awk 'NR<5{printf $1}' | perl -nlE 'while($A!=$_){$A=$_;$B=join("",sort{$b<=>$a}/(.)/g);$C=join("",sort{$a<=>$b}/(.)/g);$_=$B-$C;say}'
6084
8172
7443
3996
6264
4176
6174
6174

[A5]

小問1:

$ seq 10000 | factor | awk 'NF==2{print $2}' | shuf -n2 | sort -n | xargs | awk '{n=$1;for(i=0;i<6;i++){print n;n+=$2-$1}}' | xargs
1777 3533 5289 7045 8801 10557

小問2:

$ while :; do seq 10000 | factor | awk 'NF==2{print $2}' | shuf -n2 | sort -n | xargs | awk '{n=$1;for(i=0;i<6;i++){print n;n+=$2-$1}}' | xargs; done
3169 9743 16317 22891 29465 36039
1907 6581 11255 15929 20603 25277
839 3671 6503 9335 12167 14999
5879 6469 7059 7649 8239 8829
941 5303 9665 14027 18389 22751
4603 9857 15111 20365 25619 30873
5323 6967 8611 10255 11899 13543
877 3559 6241 8923 11605 14287
2027 6833 11639 16445 21251 26057
2741 7963 13185 18407 23629 28851
(...略...)

[A6]

# 結果が得られるまで時間がかかるので注意
$ while :; do seq 10000 | factor | awk 'NF==2{print $2}' | shuf -n2 | sort -n | xargs | awk '{n=$1;for(i=0;i<6;i++){print n;n+=$2-$1}}' | xargs; done | ruby -r prime -nae 'puts $F.join(" ") if $F.all?{|n| Prime.prime?(n.to_i)}'
2593 3433 4273 5113 5953 6793
503 593 683 773 863 953
887 9257 17627 25997 34367 42737
1747 2647 3547 4447 5347 6247
157 5407 10657 15907 21157 26407
(...略...)

[A7]

小問1:

$ cat triangle | awk '{x[NR]=$1;y[NR]=$2}END{PI=atan2(0,-0);for(i=1;i<=NR;i++){if(i>1){x1=x[i-1];y1=y[i-1];x5=x[i];y5=y[i];x2=(2*x1+x5)/3;y2=(2*y1+y5)/3;x4=(x1+2*x5)/3;y4=(y1+2*y5)/3;x3=x2+(x4-x2)*cos(PI/3)-(y4-y2)*sin(PI/3);y3=y2+(x4-x2)*sin(PI/3)+(y4-y2)*cos(PI/3);print x2,y2,"\n"x3,y3,"\n"x4,y4}print x[i],y[i]}}'
0 0
16.6667 28.8675
1.16563e-05 57.735
33.3333 57.735
50 86.6025
66.6667 57.735
100 57.735
83.3333 28.8675
100 0
66.6667 0
50 -28.8675
33.3333 0
0 0
# 結果を「A7-1.png」に出力
$ cat triangle | awk '{x[NR]=$1;y[NR]=$2}END{PI=atan2(0,-0);for(i=1;i<=NR;i++){if(i>1){x1=x[i-1];y1=y[i-1];x5=x[i];y5=y[i];x2=(2*x1+x5)/3;y2=(2*y1+y5)/3;x4=(x1+2*x5)/3;y4=(y1+2*y5)/3;x3=x2+(x4-x2)*cos(PI/3)-(y4-y2)*sin(PI/3);y3=y2+(x4-x2)*sin(PI/3)+(y4-y2)*cos(PI/3);print x2,y2,"\n"x3,y3,"\n"x4,y4}print x[i],y[i]}}' | gnuplot -e 'set terminal png;set size ratio -1;set output "./A7-1.png";plot "-" w l'

A7-1.png

小問2:

# 小問1の操作を5回繰り返し、結果を「A7-2.png」に出力
# 💡forループ内でspongeコマンドを使い、同じ名前のファイルにリダイレクト
$ cat triangle > A7-2.tmp && for i in {1..5}; do awk '{x[NR]=$1;y[NR]=$2}END{PI=atan2(0,-0);for(i=1;i<=NR;i++){if(i>1){x1=x[i-1];y1=y[i-1];x5=x[i];y5=y[i];x2=(2*x1+x5)/3;y2=(2*y1+y5)/3;x4=(x1+2*x5)/3;y4=(y1+2*y5)/3;x3=x2+(x4-x2)*cos(PI/3)-(y4-y2)*sin(PI/3);y3=y2+(x4-x2)*sin(PI/3)+(y4-y2)*cos(PI/3);print x2,y2,"\n"x3,y3,"\n"x4,y4}print x[i],y[i]}}' A7-2.tmp | sponge A7-2.tmp; done && (cat A7-2.tmp && rm -f A7-2.tmp) | gnuplot -e 'set terminal png;set size ratio -1;set output "./A7-2.png";plot "-" w l'

A7-2.png

Written on May 3, 2021