シェル芸160本ノック解答例 その10

技術評論社から出版された『1日1問、半年以内に習得 シェル・ワンライナー160本ノック』の解答例です。


問題91

$ echo {2,3,5,7}{2,3,5,7}{2,3,5,7} | xargs -n1 | while read t; do grep -o . <<<$t | sort | xargs -n3; done | sort -u | awk '$1+$2>$3' | wc -l
14

問題92

$ awk 'BEGIN{while(0.01*2^n<=1000^3)n++;print n}'
37

問題93

$ dateutils.dseq -f %Y%m%d%H%M%S '2019-1-1 0:0:0' 1s now | factor | awk 'NF==2{print $1;exit}' | tr -d :
20190101000023

問題94

$ seq 0 100 | awk '{for(i=0;i^2<=$1;i++){for(j=i;j^2<=$1;j++){for(k=j;k^2<=$1;k++){for(l=k;l^2<=$1;l++){if(i^2+j^2+k^2+l^2==$1)printf "%d=%d^2+%d^2+%d^2+%d^2\n",$1,i,j,k,l}}}}}' | sort -ut= -k1,1n
0=0^2+0^2+0^2+0^2
1=0^2+0^2+0^2+1^2
2=0^2+0^2+1^2+1^2
(...略...)
98=0^2+0^2+7^2+7^2
99=0^2+1^2+7^2+7^2
100=0^2+0^2+0^2+10^2

問題95

問題95小問1

$ seq 0 8 | perl -lnE 'printf "%08b\n",$_^($_>>1)'
00000000
00000001
00000011
00000010
00000110
00000111
00000101
00000100
00001100

問題95小問2

# 変換した交番二進符号をファイルに保存
$ seq 0 8 | perl -lnE 'printf "%08b\n",$_^($_>>1)' > graycode

# 元の10進数にデコード(解答例)
$ cat graycode | perl -lnE '$d=$b=oct("0b".$_);while($b>>=1){$d^=$b}say $d'
0
1
2
3
4
5
6
7
8

問題96

$ grep -f <(sort user? | uniq -c | awk '$1>=3{print $2}') user? | awk -F: '{n[$2]=n[$2] " "$1}END{for(d in n)print d n[d]}' | sort
2019/07/10 user1 user2 user3
2019/07/15 user1 user3 user4

問題97

$ echo たてよみ | sed 's/./R\\d+C\\d+:&,/g' | grep -Pof- <(sed 's/.*/|&|/;1s/^/||\n|-|\n/' tate.txt | pandoc -t gfm | sed '1,2d;s/| //;s/ |//;s/ /〓/g;s/./& /g' | awk '{for(i=1;i<=NF;i++)printf "R%dC%d:%s ",NR,i,$i;printf "\n"}' | rs -TC,) | sed 's/:.*//'
R1C3

問題98

$ sort list? | uniq -c | awk '{print $2>($1==2?"common":"oneside")}'

# 振り分け先のファイルの内容を確認
$ head common oneside
==> common <==
シェノ芸
シェル芸
シェレ芸
ンェル芸

==> oneside <==
シァル芸
シュル芸

問題99

問題99小問1

$ grep -P '(\D) \d+(?: \1 \d+){4}' cards.txt
♣ 7 ♣ 8 ♣ 9 ♣ 11 ♣ 13
♥ 8 ♥ 9 ♥ 10 ♥ 11 ♥ 12
♠ 9 ♠ 10 ♠ 11 ♠ 12 ♠ 13

問題99小問2

$ grep -P '\D (\d+)(?: \D \1){2} \D (\d+) \D \2|\D (\d+) \D \3 \D (\d+)(?: \D \4){2}' cards.txt
♣ 5 ♦ 5 ♣ 11 ♠ 11 ♥ 11
♠ 3 ♣ 3 ♥ 3 ♣ 11 ♦ 11
♥ 2 ♦ 2 ♠ 13 ♣ 13 ♥ 13

問題100

$ seq -w 6666666 | grep -v [789] | grep -Pv '(.).*\1' | perl -lnE '@c=split "";open F,"<shiritori.txt";$i=0;while(<F>){chomp;$w[$i++]=$_};$l="";for(@c){$l.="$w[$_] "};chop $l;say $l' | grep -P '.+(.) \1.+(.) \2.+(.) \3.+(.) \4.+(.) \5.+(.) \6'
けんこう うがい いちょう うしみつどき きゅうけい いんどあ あけがた
けんこう うしみつどき きゅうけい いちょう うがい いんどあ あけがた
Written on November 14, 2022