【問題と解答例】第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}'
************************
*
*
*
**************************
*
*
*
*
*
*
**
*
***