labunix's blog

labunixのラボUnix

第14回東京居残りシェル芸勉強会を解いてみた。

■第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}'
*******
      *
      *
      *
      *
      *
      *
      *
      *
      *
      *
      *
      *
      ******
           *
           *
           *
           *
           *
           *
           ******
                *
                *
                *
                *
                *
                *
                *
                *
                *
                *
                *
                *
                *
                *
                *
                *
                **
                 *
                 ***
                   *
                   *
                   *
                   *
                   *
                   *