【解答】年末年始シェル芸問題集
Fri Jan 2 10:44:14 JST 2015 (modified: Mon Aug 19 17:04:12 JST 2019)
views: 2658, keywords:シェル芸 この記事は最終更新日が5年以上前のものです。
年末出したシェル芸の問題の私の解答です。ただ、挑戦した皆さんの解答の方が面白いし鋭いので、「シェル芸」で検索してみてください。あとで下の方に皆さんの解答例を掲載していこうと思います。
Q1
年末年始はディレクトリの掃除をしましょう。ということで、ご自身のPCから重複しているデータを探してみてください。全てのファイルから探すのは大変なので、手始めに重複しているJPEG画像リストを作ってみてください。
解答例
もし何も出てこなかったら適当なjpegファイルをコピーして検出できるか試してみてください。「sed 's/.*/"&"/'」はファイルに半角空白があるときのためにファイル名をダブルクォートで囲む処理です。sortのLANG=Cと-sオプションはファイル数が膨大なときに処理を速くするためにつけています。
注意: 時間がかかるかもしれません。とりあえずsortの前に一度ファイルに出した方がよいかもしれません。
###出力で1列目の数が同じものが重複の疑いのあるものです###
uedambp:~ ueda$ find ~/ -type f | grep -i '\\.jpg$' | sed 's/.*/"&"/' |
xargs -n 1 gmd5sum | LANG=C sort -s -k1,1 |
awk '{if(a==$1){print b;print $0}a=$1;b=$0}'
###Linuxの場合(さらにルートから検索をかけてみる)###
ueda@remote:~$ sudo find / -type f | grep -i '\\.jpg$' | sed 's/.*/"&"/' |
sudo xargs -n 1 md5sum | LANG=C sort -s -k1,1 |
awk '{if(a==$1){print b;print $0}a=$1;b=$0}'
...
c2979e8ed193969aa9e6c2a1438b696b /home/ueda/var/www/bashcms/pages/whats_bashCMS/chinjyu.jpg
c2979e8ed193969aa9e6c2a1438b696b /home/ueda/chinjyu.jpg
f1c3a09b784cc5a55bb820aaa873c79f /var/tmp/GIT/SD_BOOK/IMAGE/noodle.jpg
f1c3a09b784cc5a55bb820aaa873c79f /home/ueda/GIT/SD_BOOK/IMAGE/noodle.jpg
###Open usp Tukubai使用###
ueda@remote:~$ sudo find / -type f | grep -i '\\.jpg$' | sed 's/.*/"&"/' |
sudo xargs -n 1 md5sum | LANG=C sort -s -k1,1 | yarr num=1 | awk 'NF>2'
Q2
羽田空港の緯度経度を求めてください。
解答例
いくつかWebAPIを提供しているサイトがあると思いますが、私はFlightRadar24から持ってきました。
uedambp:~ ueda$ curl http://www.flightradar24.com/_json/airports.php 2> /dev/null |
jq . | grep -C 6 HND
"lon": "15.082770",
"country": "Sweden",
"alt": "1503"
},{
"name": "Tokyo Haneda International Airport",
"iata": "HND",
"icao": "RJTT",
"lat": "35.552250",
"lon": "139.779602",
"country": "Japan",
"alt": "21"
},
Q3
任意の級数からネイピア数(自然対数の底の数)を求めてください。精度が良いほど良いこととします。
解答例
もっと簡単な解答がありそうですが。1/(0!)の項が抜けるので最後に1を足さなければいけないのが残念。
uedambp:~ ueda$ seq 1 1000 |
awk '{for(i=1;i<=$1;i++){printf("%d ",i)}{print ""}}' |
tr ' ' '*' | sed 's/\\*$/)/' | sed 's:^:1/(:' | bc -l |
tr '\\n' '+' | sed 's/$/1/' | bc -l
2.71828182845904523526
Q4
message2015.txtは、あるメッセージにbase64を多重にかけたものです。解読してください。ワンライナーでなくても構いません。
解答例
uedambp:~ ueda$ a=$(curl http://file.ueda.tech/message2015.txt) ;
while a=$(echo $a | base64 -D) && echo $a ; do : ; done
...
T2lncGV6b2dmQ0E2SUNaOU96b0sK
OigpezogfCA6ICZ9OzoK
:(){: | : &};:
Invalid character in input stream.
Q5
円周率をなるべく精度よく求めてみてください。
解答例
モンテカルロ法でささっと(なにがささっとだか・・・)。
uedambp:~ ueda$ cat /dev/urandom | gtr -dc '0-9' |
gfold -b10 | sed 's/^/0./' | sed 's/$/5/' |
awk 'NR%2==0{print $1}NR%2!=0{printf($1 " ")}' |
awk '{x=$1-0.5;y=$2-0.5;r=sqrt(x^2 + y^2);if(r < 0.5){n++};print NR, 4*n/NR}'
...
729078 3.14094
729079 3.14094
729080 3.14094
729081 3.14095
729082 3.14095
729083 3.14094
729084 3.14094
...
###だんだん収束していきます###
Q6
集合{a,b,c,d,e}から全ての組み合わせ(部分集合)を列挙してください。
解答例
uedambp:~ ueda$ echo {,a}{,b}{,c}{,d}{,e}
e d de c ce cd cde b be bd bde bc bce bcd bcde a ae ad ade ac ace acd acde ab abe abd abde abc abce abcd abcde
Q7
8128が完全数であることを確認してください。
解答例
uedambp:~ ueda$ seq 2 8128 | awk '{print 8128/$1}' | grep -Fv . | numsum
8128