シェル芸勉強会に参加してきた
2019/10/27
第44回シェル芸勉強会 福岡サテライト長崎分室に参加してきました。
参加者は私を含めて3人で、Youtubeでライブ配信されている東京の勉強会を見ながら参加します。 Twitterで各地サテライトのみなさんが実況したり、シェル芸Botにツイートしたりで、にぎやかな感じです。
共有スペースでの開催。途中、他イベントの参加者の方がマイクを使いはじめて、Youtubeの音声が聞こえないので、全員イヤホン装着。 周りからは、3人集まって置きながらイヤホンつけて黙々とパソコンと向き合い、何をやってるんだろう、と思われただろうなぁ。
とにかくシェル芸ははじまり、集中して問題に取り組みました
問題一覧のページは
https://b.ueda.tech/?post=20191026_shellgei_44_q
Q1
9x9の数独を列、行、ブロックに分けて表にする。 解けた。
cat sudoku | ruby -e 'a=[];9.times{a<<gets.chomp};a.each.with_index{|v,i|v.chars.each_with_index{|w,j|puts "#{i} #{j} #{j/3} #{w}"}}' #シェル芸
— tkt989 (@tkt989_dev) October 26, 2019
各行、各文字ごとにループを回すだけでOKです。
Q2
Q1で作った表に加えて、数字が埋まっていないマスに入らない数字を列挙する。 解けず、、、
惜しいところまでいった気はする。
Q3
逆にマスに入る可能性がある数字を列挙します。
cat b | ruby -e 'a=[];81.times{a<<gets.chomp};a.each{|v|if v[6]!="*" then puts v;else;puts "#{v[0..6]} #{((1..9).to_a-v[8..].split(" ").map(&:to_i)).join(" ")}";end}'
— tkt989 (@tkt989_dev) October 26, 2019
#シェル芸
値が”*”の行に対して、行の8文字名以降をsplit(“ “)した配列を[1..9]から引くことで、 マスに入る数字を求めています。 if ~ then の thenは省略できるので必要ないですね。。。
Q4
Q3の答えから数独を解くという問題。 解けた?
Q4
— tkt989 (@tkt989_dev) October 26, 2019
cat c | ruby -e 'a=[];81.times{a<<gets.chomp};s="";a.each_slice(3).each{|v|v.each{|w|if w[6]=="*" && (w[8..]||[]).size==1;s+=w[8];else;s+=w[6];end};s+="\n"};out="";s.split("\n").each_with_index{|v,i|out+=v;if i%3==2;out+="\n";end};puts out'
時間内では解けず、休憩中も書いてたのですが、次の問題が差し迫っていたのでコードがぐちゃぐちゃですね、、、
Q5
なぜか突然数独から積分の問題へ。 見た目で怖気づいて、解くのを最初から諦めてたのですが解説を聞くと、区画内の分割して関数の結果を足し合わせればいいだけなのでした。
Q6
解けた。
cat speech | ruby -e 's=[];15.times{s<<gets.chomp};f=open("speech2");puts https://t.co/s4LQnQHr2E{|v|if v.empty?;f.gets.chomp;else;v;end}.join("\n")'
— tkt989 (@tkt989_dev) October 26, 2019
#シェル芸
Q7
小問1
cat message | ruby -e 'a=gets.chomp.split(" ").map(&:to_i);puts https://t.co/3sU0Vq5iiE{|n|n**200}.map{|n|n%437}.join(" ")'
— tkt989 (@tkt989_dev) October 26, 2019
#シェル芸
awkの場合では200乗でオーバーフローしてしまうみたいですが、rubyでは大丈夫ですね。 アホみたいに直球のやり方で解けました
小問2
cat message | ruby -e 'a=gets.chomp.split(" ").map(&:to_i);(0..200).each{|i|puts https://t.co/3sU0Vq5iiE{|n|n**i}.map{|n|n%437}.map{|n|n.chr("UTF-8")}.join("")}' | grep -E "^[A-Za-z_?]+$"
— tkt989 (@tkt989_dev) October 26, 2019
#シェル芸
rubyではchr
で数値を文字に変換できる。
引数に何もしてしないと、ASCII範囲外の数値のとき例外が発生したので、ASCIIと互換性のあるUTF-8にしました。
結果はASCIIなので、grepでそれっぽい文字だけの行だけ抽出。
答えはunko_jyanai
になりました💩
この問題はRSA暗号が関係しているみたいです。 あとでYoutubeの録画を見よう。
感想
awkわからないので、rubyばっかり使っています。 すみません! でも、主催者の方から、perlでもpythonでもシェルで動けば、シェル芸だよーとありがたい言葉をもらいました。
今回で参加するのは3回目、問題も解けるようになって楽しかった。 やっぱり解けると気持ちいいですね。
ひたすらシェルと向かい合うという濃密な数時間。 終わったあとは疲れる。 でも、凄い人に会えるのは刺激になる。 これからも機会があったら、参加しよう。