- 2010-07-20 (Tue) 23:01
- プログラミング ( sed/wake/awk )
shinhさんの作った言語 wake がゴルフ場に入ったので遊んでみたのだけど… まだ言語の癖が分かっておらずプログラム書くのが難しい.
とりあえず最初の方の問題の permutator を sed のプログラムから移植してみた.
元のsedプログラムはこんな感じ:
s/.*/:&%/ : s/\(.*\)\(:.*\)\(.\)%\(.*\)/\1\2%\3\4\n\1\3\2\4%/gm s/\(.*\):%$\|.*:%.\+\n/\1/gm t
で,移植したwake のプログラムはこんな感じ:
:!$<% (.*)(!.*)(.)%(.*):$1$2%$3$4 $1$3$2$4% .*!%.+: (.*)!%:"$1\n"
元のプログラムが s コマンドしか使っておらず,かつ,置換ができなくなるまで繰り返すだけなので,wake プログラムもほとんど同じ構造.s コマンドを明記しない分とエスケープが多く無いことなどによりコードサイズも縮んだ.
sed だとレコードの切れ目を改行で表現して m オプションで一気に処理するけれど,wake だと右辺のスペースでレコードぶった切って処理してあげる形になるのね.これに気づかず右辺に空白入れないとこうなる:
:!$<%~ ([^~]*)(![^~]*)([^~])%([^~]*)(.*):$1$2%$3$4~$1$3$2$4%$5 [^~]*!%[^~]+~(.*):$1 ([^~]*)!%~(.*):"$1\n"$2
全部に付いている (.*) が明らかに無駄.ここは別処理なのでスペースで切っておくべし.
嵌りどころ:空文字列をマッチしたグループを右辺にそのまま使用する場合,最初のルールに":$<"とか書いておくと無限ループする.
さて,次は何をやろうかね.
- Newer: ことはじめ