正規表現ムズい
2017年12月2日に開催された第32回シェル芸勉強会の大阪サテライトに参加してきたのでその時の感想と自分の解答を日記します
techplay.jp
午前中
perlの正規表現第3回目
「はあ今日ここでぼくの命の輝きも終わりかあ」と会場ついたときには思いましたが、講師の方がすごくわかりやすく教えてくれたので延命できた
perlの正規表現がDFSで実装されてるので遅いという話はとてもおもしろかった
その他も強力な正規表現のオンパレードで確かにこれを習得すればシェル芸力が跳ね上がりそう...(永遠に無理)
午後
「今回の問題はヤバい」とTwitterで見ていたのでめっちゃくちゃ身構えて行きましたがいつもより時間内に解けた問題が多かったのでうれC
問題と想定解答は以下にあるよ
【問題と解答】jus共催 第32回全くインスタ映えしないシェル芸勉強会
Q1
echo
された10までの数字列に含まれない奴を歯抜けにして縦に出力する問題。のっけからパズル
僕の答え
echo 14679|grep -o .|diff - <(seq 1 10) -y|awk '{print $1}'|tr -d '>'
diff
の-y
で左右にどーんとすればいいかなーと思って素直に
競プロでいう「はい」って感じの解法だった。はい
Q2
Q1の出力で歯抜けになっているところをa,b,c....と埋めていく問題
僕の答え
echo 14679|grep -o .|comm - <(seq 1 9)|cut -f3|awk 'BEGIN{c=97}{if($1==""){printf "%c\n",c++}else{print $1}}'
前問の答え合わせのときに知ったcomm
コマンドを使ってみた。diff
の表示がわかりやすい版見たいな感じだ
問題の解答はawk
のprintf
でa
から順番に出していくだけになった。awk
ゴリゴリ
これも割とやさしい
Q3
/etc/services
から素数のTCPポート番号をもつサービスだけ取り出す問題。でたよ素数
シェル芸で素数といえばfactor
を使って素因数分解の結果を得た後、awk
でフィールド数を数える方法があまりにも有名
#素数だろうか? echo 17 | factor | awk 'NF==2{print}'
これを使ってポート番号が素数かどうか判定してecho
すれば良さそうということで以下が僕の答え
僕の答え
cat /etc/services | grep /tcp|awk '{print $1" "$2}'|sed 's|/tcp||g'|while read L;do x=$(echo $L|awk '{print $2}'); [ "$(echo $x|factor|awk 'NF==2{print}')" != "" ] && echo "$L"; done|awk '{print $1}'
うーんゴリゴリwhile read LINE;
芸
後で気づいたけどread
は二つでもフィールドを読めるのでx=
の部分はいらなかった
Q4
入力
136 725 948
を
9 7 4 1 2 8 3 5 6
に変換する問題。読解がちょっと難しいけど、9から斜めに出力していくということ
僕の答え
頭のいい解答が思いつかなかったのでちょっとセコい方法で
cat ./nums.txt |xargs|tr -d ' '|python -c "x=input();l=[6,3,7,0,4,8,1,5,2]; for i in l: print(x[i]) "
3x3の入力をxargs
とtr
で1列に整形してから6,3,7,0,4,8,1,5,2の順番に出力した出力自体は何でもよかったけどpython
を使った
ワンラインじゃないけど....いいでしょたぶん....
こんなんじゃなく賢いやり方をみると「ほぉぉ〜〜」ってなるのがシェル芸勉強会のおもしろい所の1つだとおもいます
Q5
テキストファイルからウムラウトだけを抽出する問題。なんやこれ....
ちなみにウムラウトってのは文字の上に点々がついてるアレ
時間内に解けたのはここまで
僕の答え
cat ./umlaut.txt |xargs|tr -d ' '|csharp -e 'foreach(var c in Console.ReadLine().Where(x=>x>=196&&x<12450)) Console.WriteLine(c)'
ウッ...!C#!方針としてはアスキーコードを見てある範囲内ならウムラウトだとするようにしたWhere
で削ってWriteLine
するだけ
csharp
コマンド楽しいのでぜひインストールしよう
Q6
誰かのTwitterをターゲットにして新しい投稿がある度に端末上に「んほぉ!」と出力する問題。なんやこれ....なんやこれ...
曰く急に生徒がこなくなったときこれがあれば生きてるかどうか分かるらしい...ホンマか
この問題は時間内に解けなかったので解答はなし。w3m
ですくれいぴんぐ?して総ツイート数を比較するらしい
wget
で同じことしようとしてたがうまく抽出できず...!無念!!
Q7
縮小をする画像処理アルゴリズムのワンライナー化問題。普通にスマートなやり方はない
C#でゴリゴリやればできると思うけどめっちゃ長くなって読みにくいしバグらせるしモウダメ...となってるうちに時間切れ
Q8
満身創痍で挑むラスト問題はカタカナや漢字が行頭にくるようなワンライナーを考える問題。
ただし「シェル芸」みたいなものは1つの単語としてカウントすること。なんやのこれ...
午前中に覚えたperlの正規表現と\p{Hiragana}\p{Han}\p{Katakana}
を使ってやるだけかと思ったが「シェル芸」を一塊にできず時間切れ。なんやこれ
LT
今回もLTまで参加させてもらった。毎回「ほえ〜〜〜」となる話とかが多くて楽しい
https://t.co/ssWsaB5Hpn
— 小原 一哉 (@KoharaKazuya) 2017年12月2日
シェル芸勉強会大阪サテライトの LT をそろそろ始めます!#シェル芸 #大阪
発表者の紹介とかは上のYoutubeにお任せします★
一番目はinterdiff
というコマンドの紹介
最初はdiff
のバイナリのdiff
をとる話なのかと思って「何を言ってるんだ...」と思ったけどそうじゃなくてよかった。まともな人でよかった
diff
の意味分からん表示じゃなくてわかりやすくdiff
をとってくれるのですごい便利という話だった
二番目は僕
bind
を使って危険シェル芸をするはなしをした
難読化のつもりで始めたけどそうならなかったのでこうなった(?)
三番目は非公開でとのことだったので詳細は話せないけどふとした瞬間にシェル芸を発動できる素敵な話だった
次のLTでは準備万端でお話ししていただけるらしいので超楽しみだ
四番目はsed
で寿司を回すお話だった
何が起きているのか分からなかったけどsed
マスターの発表者が解説してくれたのでわかった(わからない)
sed
ってすごいなあ...という気持ちで支配されたLTだった
まとめ
今回もはちゃめちゃでおもしろかった。シェル芸自体は去年の今頃に存在を知り、今年の6月ごろに勉強会に初参加させていただいた新参者なのでまだまだ精進するぞと言う気持ち
また機会があれば参加したいな〜と思っています。よろしくお願いいたします。