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

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

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

おおよそ1ヶ月前の話になってしまいましたが、シェル芸勉強会 第38回 に参加していましたので、その振り返り記事です。
usptomo.doorkeeper.jp
明日からは12月。世間的にはアドベントカレンダー向けのブログ記事が山ほど出てくる時期です。それまでに公開しないとすぐに埋もれてしまう!と危機感を抱きつつ慌てて書いたのですが、11月も残り40分程度で終わりですので、この記事だってすぐに埋没してしまうに違いありません。

ちなみに、前に参加した時は、こんな感じでした。
tmotooka.hatenablog.jp

午前

シェルで文字コードに触れてみる その3という題での鳥海先生の講演でした。
内容は他のブログ等で既に言及されている通りなのですが、

  • bashfor を使ってASCIIコード表を作ったり、
  • 区点コードから JIS X 0208, EUC JP, Shift JIS 等におけるコードを導出したり、

といった話がありました。
パイプを繋げている途中で (echo ibase=16; cat) を挟むと、出力の先頭に ibase=16 を入れることができるので、16進数演算をbcに任せることができる、というテクニックはなるほどなー、と思いました。bc以外にも応用できそうですね。

午後

私の答案を晒します。
問題文と解答例は、こちら。
【問題と解答】jus共催 第38回҈҈҉҈҈҉シ҈҉ェ҈҉ル҈҉芸҈҉勉҈҉強҈҉会 | 上田ブログ

Q1

素直に問題の文字を消す方向で頑張りました。

echo "jus共催 第38回҈҈҉҈҈҉シ҈҉ェ҈҉ル҈҉芸҈҉勉҈҉強҈҉会" | tr -d' | tr -d '҉'

問題の文字を1文字だけコピーするのはどうするのか?というところこそが難しかったのかもしれません。
私は次のワンライナーにより、問題の文字をコピーできるようにしました。これらの問題の文字は隣の文字を修飾する効果があり、通常(たぶん)のテキストエディタでは選択しようとしても被修飾の文字と一緒にしか選択できないのですが、1行に含まれる文字がこれらの修飾の文字だけであればマウス操作で選択できるようになります(Macの話です)

echo "jus共催 第38回҈҈҉҈҈҉シ҈҉ェ҈҉ル҈҉芸҈҉勉҈҉強҈҉会" | grep -o . | sort | uniq
Q2

次のように回答しました。

echo '不摂生' | grep -o . | grep $(echo -n '[';head  仏* | tr -d '\n';echo -n ']')

解答例はgrepの -f オプションを使っていてなるほど〜〜〜、となりました。なるほど。

Q3

これは回答できませんでした。

Q4

次のように回答しました。

echo {A..Z} {A..Z}{A..Z} {A..Z}{A..Z}{A..Z} | sed 's/ /\n/g' | nl | grep XYZ

おおよそ解答例と同じですね。

Q5

これも回答できませんでした。

Q6

私の端末にはログとして

yes 仏説摩訶般若波羅蜜多心経

という記録があるだけでした。ダメですwwダメww

Q7

次のように回答しました。

echo {1..100},{1..100} | tr ' ' '\n' | tr ',' ' ' | awk '(($1*$1+$2*$2)%($1*$2+1)==0){print $1,$2,(($1*$1+$2*$2)/($1*$2+1))}'

ランダムではなくて小さいものから総当たりで探索していることになります。探索対象の組み合わせの数を増やして実行すると、Ctrl-C でも実行中断できない状態に陥りました。ブレース展開の途中だとシグナル無視するのでしょうか? ちょっとだけ危険ですのでご注意を。この回答例では100*100で1万個の探索をやっているだけですから、まだ地球に優しいですね。

Q8

次のように回答しました。

seq 684000 6845000 | awk '{print $1/1000000}' | grep -v -f <(yes | awk 'BEGIN{x=0.5;a=3}{x=a*x*(1-x);print x;}' | head -n 1000000)

この設定でこの区域だと 0.684032 が出力されません。
Q2で学んだばかりのgrepの -f オプションを早速活用することができて、会場でドヤ顔していたことを覚えています。


という訳で、5問回答しました。

LT

夜から別の用事があったので、残念ながら途中で帰ってしまいました。
次に参加して発表するときのために、またネタを用意しておきたいと思います。
(残念ながら12月の会は出席できないので、また年明けに…)