たいちょーの雑記

ぼくが3日に一度くらい雑記をかくところ

第32回シェル芸勉強会大阪サテライトに参加した

正規表現ムズい

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の表示がわかりやすい版見たいな感じだ
問題の解答はawkprintfaから順番に出していくだけになった。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の入力をxargstrで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まで参加させてもらった。毎回「ほえ〜〜〜」となる話とかが多くて楽しい

発表者の紹介とかは上のYoutubeにお任せします★

一番目はinterdiffというコマンドの紹介
最初はdiffのバイナリのdiffをとる話なのかと思って「何を言ってるんだ...」と思ったけどそうじゃなくてよかった。まともな人でよかった
diffの意味分からん表示じゃなくてわかりやすくdiffをとってくれるのですごい便利という話だった

二番目は僕
bindを使って危険シェル芸をするはなしをした


難読化のつもりで始めたけどそうならなかったのでこうなった(?)

三番目は非公開でとのことだったので詳細は話せないけどふとした瞬間にシェル芸を発動できる素敵な話だった
次のLTでは準備万端でお話ししていただけるらしいので超楽しみだ

四番目はsedで寿司を回すお話だった
何が起きているのか分からなかったけどsedマスターの発表者が解説してくれたのでわかった(わからない)
sedってすごいなあ...という気持ちで支配されたLTだった

まとめ

今回もはちゃめちゃでおもしろかった。シェル芸自体は去年の今頃に存在を知り、今年の6月ごろに勉強会に初参加させていただいた新参者なのでまだまだ精進するぞと言う気持ち

また機会があれば参加したいな〜と思っています。よろしくお願いいたします。