Upload
ryuichi-ueda
View
7.128
Download
0
Embed Size (px)
DESCRIPTION
2013年8月24日、LLまつりにて行ったチュートリアル。いつもより難しめの問題。
Citation preview
第6回チャンピオンシップ シェル芸ランナー勉強会
in LLまつり
USP友の会/産業技術大学院大学 上田隆一
こんにちは
• 本セッションは、 アバンギャルドな Lightweight Language 「シェル(スクリプト)」 のチュートリアルです。
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 2
あのWikipediaも言っている
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 3
本日はシェル芸勉強会をやります
• シェル芸とは? – マウスも使わず、ソースコードも残さず、 GUIツールを立ち上げる間もなく、 あらゆる調査・計算・テキスト処理を コマンド入力一撃で終わらす。
– 格闘技で言えばコンバットサンボ • 理屈ばかり言っていると
この人(右図)に殺されると思え
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 4
h=p://www.kremlin.ru
これまでのシェル芸勉強会
• 2012年10月(45人) – hbstudy#38 シェルスクリプト(Open usp Tukubai)で
いろいろやってみよう!
• 2012年12月(25人) – USP友の会会長presents第2回チキチキ!シェル芸人養成勉強会
• 2013年2月(32人) – 第3回シェル芸爆破デスマッチ勉強会
• 2013年4月(53人) – 第4回春爛漫シェル芸人撩乱勉強会
• 2013年6月(35人) – 第5回シェル芸勉強会(プレーンタイプ)
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 5
延べ(?)190人 のシェル芸人を 荒野に放つ!!
こういう問題を解いてます
• Q. 0〜9までの数字で欠けているものは? 4 3 5 9 8 2
• A. $ echo 4 3 5 9 8 2 | tr ' ' '\n' | cat -‐ <(seq 0 9) | sort | uniq -‐u | tr '\n' ' ' 0 1 6 7
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 6
シェル芸勉強会の意義
• 普段の仕事にCUIを役立てるためのスキル を身につけることが趣旨 – ユーザとしてどうコンピュータを使い倒すか?
• 料理人はひたすら包丁や鍋の評論をするか? – 料理の方が大事 – 使いこなすことの方が大事
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 7
使うもの
• 自分が普段使っているマシーン • 自分が普段使っているワンライナー環境 – 他流試合大歓迎
• PerlでもRubyでもPowerShellでもOK
• 解答はMacとbashで作成しました
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 8
その前に一つ宣伝
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 9
h=p://ja.wikipedia.org/wiki/たらい舟
では始めます
• 諸注意 – 全7問 – コマンドがなかったらその場でインストール願います
– 今回はLLまつりということで、かなり難易度高め • あまり実用的でない
– どんどんツッコンでください(悪意がなければ)
• ・・・では参りましょう。
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 10
第1問 文字の選別
• 次の文字列について、濁点の文字、半濁点の文字、その他の文字(記号含む)の数を数えてください
「どんどこどん、ぱらぱっぱ、ぴろぴろぴー、 すっとこどっこい。」 (注意:特に意味はない。)
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 11
解答
• 半角に直して濁点・半濁点を分離 → 集計
– $ echo どんどこどん、ぱらぱっぱ、ぴろぴろぴー、すっとこどっこい。| gsed 's/./\n&/g' | nkf -‐h2 | nkf -‐Z4 | sed 's/./& /' | awk 'NF==2{print $2}NF==1{print "_"}' | sort | uniq -‐c
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 12
第2問 横にcatする
• 二つのファイルを横にくっつけてください
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 13
解答
• $ awk '{print FNR,$0}' fileA fileB | sort -‐s -‐k1,1 | awk 'NR%2==0{print $2}NR%2==1{prinn $2}'
• Open usp Tukubaiを使う – $ ycat file{A,B} | tr -‐d ' '
• 会場から – $ paste file{A,B} | tr -‐d '\t'
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 14
第3問 小町算
• 次のechoから始めて 4つの数字の間に + -‐ * / の符号を入れ、 100になる計算式を ワンライナーで一つ作ってください
• $ echo 56 2 8 9
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 15
解答
• ランダムに数式を作って100になったら止める – $ echo 56 2 8 9 | awk '{while(1){print "/ + -‐ *",$0,int(rand()*4)+1,int(rand()*4)+1,int(rand()*4)+1}}' | awk '{print $5 $($9) $6 $($10) $7 $($11) $8}' | perl -‐anle 'print $F[0]," ",eval($F[0])' | grep " 100$" | head -‐n 1
• 律儀に式を作る – $ echo 56 2 8 9 | awk '{a[0]="+";a[1]="-‐";a[2]="*";a[3]="/";for(i=0;i<4*4*4;i++){print $1 a[int(i/16)] $2 a[int(i/4)%4] $3 a[i%4] $4}}' | perl -‐anle 'print $F[0]," ",eval($F[0])' | grep " 100$"
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 16
• perl不使用バージョン – $ echo 56 2 8 9 | awk '{while(1){print "+ -‐ / *",$0}}' | awk '{print $5 $(rand()*4+1) $6 $(rand()*4+1) $7 $(rand()*4+1) $8}' | while read ln ; do A=$(echo $ln | bc) ; echo $ln $A; done | awk '$2==100{print $0;exit(0)}'
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 17
第4問 ネットから拝借
• h=p://ja.wikipedia.org/wiki/ISO_3166-‐1 (ISO 3166-‐1 -‐-‐wikipedia)のページから、 アイスランド IS アイルランド IE アゼルバイジャン AZ アフガニスタン AF ... のように、国名と2レターコードの対 のリストを作りましょう。 2013年8月24日
第6回チャンピオンシップシェル芸ランナー勉強会 in LLまつり 18
解答
• 例 – $ curl h=p://ja.wikipedia.org/wiki/ISO_3166-‐1 2> /dev/null | awk '/<table class="sortable/,/<\/table>/' | grep -‐A 5 '^<tr' | sed 's;.*>\(..*\)</a></td>;\1;' | grep -‐v "lang=" | grep -‐v "t[rh]" | sed 's;</*td>;;g' | awk '/-‐-‐/{print ""}!/-‐-‐/{prinn $1 " "}' | awk '{print $1,$4}'
– 出力を確認しながら泥縄式で作ればよい – 途中でexcelなどに切り替えても特に構わないので、
途中までワンライナーで整理してみる。
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 19
第5問 フィボナッチ数
• 延々とフィボナッチ数を出力するワンライナー を記述してください。 ただし桁数が増えてもなるべく正確に。
– 0,1,1,2,3,5,8,13...
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 20
解答
• $ a=0; b=1; while : ; do c=$(echo "$a+$b" | bc | tr -‐d '\n\') ; echo $a ; a=$b ; b=$c ; done
• 会場から – ruby -‐e "a = [1, 1]; loop { puts n = a.inject(:+); a.shiz; a << n; }"
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 21
第6問 50音の取得
• 以下の出力を得てください。 (echo あいうえお・・・以外で)
• あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 22
解答
• 例(cp932の半角カナから) – $ echo {177..220} 166 221 | tr ' ' '\n' | LANG=C gawk '{prinn("%c",$1)}' | iconv -‐f cp932 -‐t un8 | nkf -‐h1
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 23
第7問 ユニコード一覧作成
• 下のようなUnicodeとひらがな(U+3041「ぁ」〜 U+3094「ゔ」)のリストを作成してください。 この問題もiconvを使います。
U+3041 ぁ
U+3042 あ
U+3043 ぃ ... U+3092 を
U+3093 ん
U+3094 ゔ
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 24
解答
• $ seq 0x3041 0x3094 | LANG=C gawk '{prinn("%c%c%c%c",int($1/256),$1%256,0,10)}' | iconv -‐f UCS-‐2BE -‐t un8 | awk -‐v a="0x3041" '{prinn("U+%X %s\n",a++,$0)}'
• 会場から – $ ruby -‐e "0x3041.upto(0x3094) {|n| puts 'U+%x %s' % [n, [n].pack('U')]}"
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 25
おわりに
• おつかれさまでした・・・ – まだLLまつりは続きますので、死なないで下さい。
• 次回はおそらく10月 – お待ちしております。
2013年8月24日 第6回チャンピオンシップシェル芸ランナー
勉強会 in LLまつり 26