More Related Content
More from Ryuichi Ueda (20)
20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり
- 5. これまでのシェル芸勉強会
• 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人
のシェル芸人を
荒野に放つ!!
- 6. こういう問題を解いてます
• 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
- 8. 使うもの
• 自分が普段使っているマシーン
• 自分が普段使っているワンライナー環境
– 他流試合大歓迎
• PerlでもRubyでもPowerShellでもOK
• 解答はMacとbashで作成しました
2013年8月24日
第6回チャンピオンシップシェル芸ランナー
勉強会 in
LLまつり
8
- 10. では始めます
• 諸注意
– 全7問
– コマンドがなかったらその場でインストール願います
– 今回はLLまつりということで、かなり難易度高め
• あまり実用的でない
– どんどんツッコンでください(悪意がなければ)
• ・・・では参りましょう。
2013年8月24日
第6回チャンピオンシップシェル芸ランナー
勉強会 in
LLまつり
10
- 12. 解答
• 半角に直して濁点・半濁点を分離
→
集計
– $
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
- 14. 解答
• $
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
- 16. 解答
• ランダムに数式を作って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
- 17. • 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
- 19. 解答
• 例
– $
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
- 21. 解答
• $
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
- 22. 第6問
50音の取得
• 以下の出力を得てください。
(echo
あいうえお・・・以外で)
• あいうえおかきくけこさしすせそたちつてとな
にぬねのはひふへほまみむめもやゆよらりる
れろわをん
2013年8月24日
第6回チャンピオンシップシェル芸ランナー
勉強会 in
LLまつり
22
- 23. 解答
• 例(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
- 24. 第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
- 25. 解答
• $
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
%sn",a++,$0)}'
• 会場から
– $
ruby
-‐e
"0x3041.upto(0x3094)
{|n|
puts
'U+%x
%s'
%
[n,
[n].pack('U')]}"
2013年8月24日
第6回チャンピオンシップシェル芸ランナー
勉強会 in
LLまつり
25