職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

第43回 #シェル芸 勉強会 参加記

jus共催 第43回大暴れシェル芸勉強会 に参加してきました!
usptomo.doorkeeper.jp
この記事は、その答案等をメモしたものです。

シェル芸 とは

午前の部

今回は午前は無しです。ネタ切れという噂。
次回はnodeシェル芸の解説会になるかも、という話もあります。

午後の部

毎回恒例、出された問題を解く
これまではMacの標準のbashや、普通のUbuntuで参加していましたが、今回はシェル芸botのDockerイメージで臨みました。
github.com
新し目*1のdockerが入っている環境ならば docker run -it theoldmoon0602/shellgeibot:latest bash とか、こんな感じのコマンドを叩く(+そこそこの容量のダウンロード)だけで動かせて、みんなが慣れ親しんでいる各種コマンド群がインストールされた状態で使えますので、とても便利です。メンテナの皆さんに感謝🙏

今回の問題はこちら

Q1

こう回答しました。そこそこのスピードで書けたかな。

echo あいうえお | grep -o . | nl | awk '{for(i=0;i<$1;i++){print $2}}' | tr -d "\n"
Q2

敢えてawkを使わずに解こうとした結果、時間内には解ききれず。でも、最終的に答案はこうなりました。

echo {1..10},{1..10},{1..10} | tr ' ' "\n" | sed 's/\(.*\),\(.*\),\(.*\)/echo -n \1個 \2個 \3個; echo "\1*11+\2*21+\3*54" | bc/' | bash | grep 223 | sed 's/223//'
Q3

bcコマンドの基数変換の機能を使いました。

echo 192.168.10.55 | tr '.' '\n' | sed 's/\(.*\)/echo -n "00000000"; echo "obase=2;\1" | bc/' | bash | sed 's/.*\(........\)$/\1/' | tr -d '\n'

勉強会で ipcalc というIPアドレス演算用のコマンドがあることを知り、便利そうだなと思いました。さっそくシェル芸botに組み入れられるあたり、さすがです。

Q4

双子素数の問題。awkに直前の行を覚えておいてもらうという方法を取りました。素数列挙を2プロセスで回すという方式も面白そうですね。

seq 1000 | factor | grep '^.*: [0-9]*$' | sed 's/:.*//' | awk 'BEGIN{p=-1}{if(p+2==$1){print p,$1}p=$1}'
Q5

こう回答しましたが、これは誤答です🙅‍♀️

echo {0..4},{0..4},{0..4},{0..4} | tr ' ' \\n | tr , ' ' | awk '($1+$2+$3+$4==10){print $0}' | sed -e 's/0//g' -e 's/  / /g' -e 's/^ //' | sort | uniq | tr '\n' '|'

最後のtrは、シェル芸botで実行された際の出力行数抑制のための思いやりです。
さて、これだと、同じ数字を複数回使っているものを検出することができません。正答例では grep -Ev '(.).*\1 が使われています。これなら効率的に重複文字をはじくことができます。さすがです。

Q6

😵

Q7

SVGを描いてそれを変換させる方向で頑張ろうとしましたが、どうもシェル芸botに入っているImageMagickではSVGの入力を受け付けていないような気がします。時間が無くて詳細の調査をできてないのですが、原因等がわかれば(または再現範囲が明確になれば)報告しようと思います。
ちなみに、回答時間中に作ったSVG市松模様が、こちら。
SVGなら、この程度のコード量で市松模様を作れます。

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
  <pattern x="0" y="0" width="2" height="2" id="p" patternUnits="userSpaceOnUse">
    <rect width="1" height="1"/>
    <rect x="1" y="1" width="1" height="1"/>
  </pattern>
  <rect width="100" height="100" fill="url(#p)"/>
</svg>


Q8

😵

Q9

😵

午後の部を総じて

3問回答、という結果でした。次も頑張ろう〜

懇親会(LT大会)

VUIでシェル芸を実行できるようにしてみた - Speaker Deck
実際にAlexaさんに向かって呪文を詠唱している様子を見て腹筋崩壊ww

他にも魅力的なものが多くありました!

*1:必要バージョンは上記GitHub参照のこと。本記事執筆時点では18.09以上とのこと。