【問題と解答例】第14回東京居残りシェル芸勉強会

Sat Nov 29 14:40:42 JST 2014 (modified: Mon Aug 19 09:14:33 JST 2019)
views: 2856, keywords:勉強会,シェル芸,シェル芸勉強会,難しめ この記事は最終更新日が5年以上前のものです。

始める前に

今回はLinuxで解答例を作りましたので、BSD系、Macな方は以下の表をご参考に・・・。

Mac,BSD系 Linux
gdate date
gsed sed
tail -r tac
gtr tr
gfold fold

イントロ

Q1

100!を計算してください。正確に。

解答例

ueda@remote:~$ seq 100 | xargs | tr ' ' '*' | bc
   93326215443944152681699238856266700490715968264381621468592963895217\\
   59999322991560894146397615651828625369792082722375825118521091686400\\
   0000000000000000000000
   ueda@remote:~$ python -c 'import math;print math.factorial(100)'
   93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
   ###中央大の飯尾先生から###
   ueda@remote:~$ echo `seq 100` "`yes '*' | head -99`" p | dc
   933262154439441526816992388562667004907159682643816214685929638952175\\
   999932299156089414639761565182862536979208272237582511852109168640000\\
   00000000000000000000

Q2

次のseqからsed(と言ってもgsed)だけでfizzbuzzを完成させてください。

ueda@remote:~$ seq 100 | sed ...
   1
   2
   Fizz
   4
   Buzz
   Fizz
   7
   8
   Fizz
   Buzz
   11
   Fizz
   13
   14
   FizzBuzz
   16
   17
   Fizz
   19
   Buzz
   ...

解答例

ueda@remote:~$ seq 100 | sed '5~5s/.*/Buzz/' | sed '3~3s/[0-9]*/Fizz/'

Q3

このうち素数はどれでしょうか?

ueda@remote:~$ echo 0xaf 0x13 0x0d 0x24 0x58

解答例

ueda@remote:~$ echo 0xaf 0x13 0x0d 0x24 0x58 | xargs printf "%d\\n" |
    factor | awk 'NF==2{print $2}' | xargs printf "0x%02x\\n"
   0x13
   0x0d

Q4

次の16進数(UTF-8)で書かれたメッセージを復元してください。

e89fb9e3818ce9a39fe381b9e3819fe38184

解答例

ueda@remote:~$ echo e89fb9e3818ce9a39fe381b9e3819fe38184 | xxd -p -r
   蟹が食べたいueda@remote:~$
   ueda@remote:~$ echo e89fb9e3818ce9a39fe381b9e3819fe38184 | fold -b2 |
    sed 's/^/0x/' | xargs printf '%d\\n' | LANG=C awk '{printf("%c",$1)}'
   蟹が食べたいueda@remote:~$ 

Q5

次のようなファイルを作ってください。 (catするとahoとだけ出て、容量は1GB。)

ueda@remote:~$ cat hoge
   aho
   ueda@remote:~$ ls -l hoge
   -rw-r--r-- 1 ueda ueda 1000000000 12月 7 14:53 hoge

解答例

$ cat /dev/zero | head -c 999999996 | cat <(echo "aho") - > hoge

Q6

日本の山を標高の高い順から並べていってください。順位と標高も一緒に出力してください。(こちらからcurlで持ってきて加工してください)

おそらく力技になります。

解答例

ueda@remote:~$ 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 | 
   sed -n '/<table class="sortable"/,$p' | sed -n '1,/<\\/table>/p' | 
   grep '^<td>' | grep -v jpg | sed 's/<\\/*small>//g' | sed 's/<\\/.*$//' |
    sed 's/.*>//' | awk '/^[0-9][0-9]*$/{print ""}{printf("%s ",$0)}' |
    awk 'NF{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'

解答例

ueda@remote:~$ echo '1/4 + 2/5 + 7/16 - 5/9' | sed 's/[+-]/\\n&/g' |
    tr '/' ' ' | sed 's/^+ //' | sed 's/- /-/' |
    awk 'BEGIN{n=0;d=1}{n=n*$2+d*$1;d=d*$2}END{print n,d}'
   1532 2880
   ###約分(死ぬ)###
   ueda@remote:~$ echo '1/4 + 2/5 + 7/16 - 5/9' | sed 's/[+-]/\\n&/g' |
    tr '/' ' ' | sed 's/^+ //' | sed 's/- /-/' |
    awk 'BEGIN{n=0;d=1}{n=n*$2+d*$1;d=d*$2}END{print n,d}' | factor |
    awk 'NR==1{$1="a";print}NR==2{$1="b";print}' | tarr num=1 |
    count 1 2 | self 2 1 3 | sort | yarr num=1 |
    awk 'NF==5{if($3>$5){print $1,$2,$3-$5}else{print $1,$4,$5-$3}}NF!=5{print}'
    | grep -v ' 0$' | self 2 1 3 | sort |
    awk '{a=1;for(i=0;i<$3;i++){a*=$2};print $1,a}' | yarr num=1 |
    awk '{a=1;for(i=2;i<=NF;i++){a*=$i};print $1,a}'
   a 383
   b 720
   ###素直に(?)Python使いましょう###
   ueda@remote:~$ echo '1/4 + 2/5 + 7/16 - 5/9' | sed 's/\\([+-]\\) /\\1/g' |
    sed 's;\\([+-]*[0-9]*\\)/\\([0-9]*\\);+ Fraction(\\1,\\2);g' |
    awk '{print "from fractions import Fraction ; a = ",$0,";print a"}' |
    python 
   383/720

Q8

*****************************************************************

をポキポキ折ってください。

###例###
   ************************
    *
    *
    *
    **************************
    *
    *
    *
    *
    *
    *
    **
    *
    ***

解答例

ueda@remote:~$ echo '*****************************************************************' |
    grep -o . | awk '{r=int(rand()*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}'
   ************************
    *
    *
    *
    **************************
    *
    *
    *
    *
    *
    *
    **
    *
    ***
ノート   このエントリーをはてなブックマークに追加 
 

prev:Structure and Interpretation of Computer Programs読書会26回目メモ書き next:「イラストで学ぶ人工知能概論」を拝読したので薄口感想文

やり散らかし一覧

記事いろいろ