参加しました
問題
Q1
echo
コマンドを使わずに A=$(echo {a,b,c,d}{1,2,3,4})
相当のことを実行する問題。これ進研ゼミ(難読化シェル芸)でみたやつだ!
set {a,b,c,d}{1,2,3,4} A=$@ echo $A
set
を使うと位置パラメータに展開されるので、$A
に再代入すれば良いのです。zsh
だと (){$A=$@} {a,b,c,d}{1,2,3,4}; echo $A
という感じに無名関数を呼べるので、引数をAに展開するようにしてえいです
Q2
秒数が3の倍数の時にアホとターミナルに出力する関数をできるだけ短く書く問題
f(){[[ "$(date +%S|awk '($1%3)==0')" != "" ]] && echo アホ; sleep 1; f}
date
の+%S
で現在の秒数だけ出力します。シェルの$(())
で剰余を求めてもいいんですけど、09
のときに8進数として壊れてしまうのでawk
で計算しています。関数の最後で自分自身を呼び出して再帰しています。
Q3
/
を使わず ls / / / / / / / / / /
相当のコマンドを実行する問題。難読化か
: $(pwd);yes "ls ${_::1}" | head -n10 | bash
: $(pwd)
で$_
に現在のパス展開します。$_
から/
を切り出してコマンドを作り出します。yes
とhead
で10個にしてbash
に渡します。
Q4
danger
ファイルの中から実行してしまうとファイルを削除してしまうコマンドを探す問題。
cat S*/*60/da* | sed 's@^@echo @' | bash | grep -nv '*'
先頭にecho
をつければクォートがおかしいコマンドについては展開されます。これを利用して*
がなくなってしまった行だけ取り出して終了です。これ、難読化シェル芸はecho
するとすべてわかるっていうのに似ていますね。
Q5
ls -l
の出力のスペースをつめる問題。ただし、ls
以外の外部コマンドを使わないこと。という問題
set "$(/bin/ls -l)"; echo "${@// / }"
短くかけたんですが、スペースが3個以上になることがあり敗北です。
Q6
figlet
の出力2つを受け取り、それらを横に連結する関数を作る問題。小問1は引数2つまで、小問2は引数が何個でもできるものを作ります。
なんだけどいきなり小問2から始めてしまったのでこれで
f(){ X=$(paste <(echo "$1") <(echo "$2")); shift; shift && f "$X" "$@" || echo $X }
引数をshift
で切り出しながらpaste
で連結。引数がまだ残っていれば再帰してやります。なければ出力して終了です。
Q7
タイムアップ
Q8
以下のような出力が得られる変数A
を作る問題
$ echo $A c $ echo $A | grep a c
なんだこれは…。
A="\033[ac" echo $A; echo $A | grep a
エスケープシーケンス内にa
を仕込んでしまう方法を試してみました。手元のzshだとうまくいったので投稿してみたんですが、botだといい感じにならなかったですね。難しい。
LT
今回もLTさせていただきました!yukichant
の出力を画像にし、高速に詠唱する試みです。聞いてくださった皆様ありがとうございました!
おわり
今回は久しぶりの物理会場ということで、苦しんでる人が近くにいるとなんだか安心するなあという感覚がよみがえりました。次回はどうなることかわかりませんが、また参加出来たらと思います。企画運営の皆様ありがとうございました。