■第14回東京居残りシェル芸勉強会を解いてみた。 シェル芸勉強会の自分の回答一覧(第1回~第13回) http://labunix.hateblo.jp/entry/20150316/1426433547 シェル芸勉強会スライド一覧 http://blog.ueda.asia/?page_id=684 ■Q1. 100!を計算してください。正確に。 $ echo "(! 100)" | clisp -q | tail -1 | sed s/".\{80\}"/"&\n"/g 93326215443944152681699238856266700490715968264381621468592963895217599993229915 608941463976156518286253697920827223758251185210916864000000000000000000000000 ■Q2.次のseqからsed(と言ってもgsed)だけでfizzbuzzを完成させてください。 $ seq 100 | sed '3~3cFiZZ' | sed '5~5cBuzz' | sed '15~15cFizzBuzz' $ seq 100 | sed -e '15~15cFizzBuzz' -e '5~5cBuzz' -e '3~3cFiZZ' ■Q3.このうち素数はどれでしょうか? factorの方が速いけど。 $ echo 0xaf 0x13 0x0d 0x24 0x58 | \ for n in `xargs`;do echo "$(($n))" | \ openssl prime `xargs` | grep "is prime" >/dev/null && echo "$n"; \ done 0x13 0x0d ■Q4.次の16進数(UTF-8)で書かれたメッセージを復元してください。 改行コードは入れましょう。 e89fb9e3818ce9a39fe381b9e3819fe38184 $ echo "e89fb9e3818ce9a39fe381b9" | xxd -r -p;echo 蟹が食べたい $ echo "蟹が食べたい" | xxd -p e89fb9e3818ce9a39fe381b9e3819fe381840a $ echo -n "蟹が食べたい" | xxd -p e89fb9e3818ce9a39fe381b9e3819fe38184 ■Q5.次のようなファイルを作ってください。 (catするとahoとだけ出て、容量は1GB。) 1GBも無駄ファイルは作れないので、1MBで。 $ cat /dev/zero | head -c $(((1024*1024)-4)) | cat <(echo "aho") - > aho $ du aho 1024 aho $ cat aho aho ■Q6.日本の山を標高の高い順から並べていってください。順位と標高も一緒に出力してください。 (こちらからcurlで持ってきて加工してください) $ curl http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E5%B1%B1%E4%B8%80%E8%A6%A7_%28%E9%AB%98%E3%81%95%E9%A0%86%29 2> /dev/null | \ w3m -dump -T text/html -cols 1000 | grep "^[1-9] \|^10 " | awk '{print $1,$2,$4}' 1 富士山 3,775.6 2 北岳 3,193.2 3 奥穂高岳 3,190 3 間ノ岳 3,190 5 槍ヶ岳 3,180 6 悪沢岳 3,141 7 赤石岳 3,120.53 8 涸沢岳 3,110 9 北穂高岳 3,106 10 大喰岳 3,101 ■Q7.分数で正確に答えを求めてください。できれば約分してください。 $ echo '(-(+(+ 1/4 2/5) 7/16) 5/9)' | clisp -q | tail -1 383/720 ■Q8.「*****************************************************************」をポキポキ折ってください。 これはパクリで。 $ echo -n '*****************************************************************' | wc -c 65 $ echo '*****************************************************************' | \ sed s/./"&\n"/g | awk '{r=int(rand()*1024%10);if(r<1){print}else{printf($1)}}' | \ sed '1~2n;s/./&\n/g' | awk 'NF' | \ awk '{for(i=0;i<a;i++){printf(" ")}print}length($1)>1{a+=length($1)-1}' ******* * * * * * * * * * * * * ****** * * * * * * ****** * * * * * * * * * * * * * * * * ** * *** * * * * * *