121321とABBA
ttp あたりから、sed にちょうど良い問題が続いている。そんなわけで、ここのところ、sed 中心に golf している。
121321
122333 の姉妹問題。なかなかの良問だったと思う。sed もとても面白かった。トップとれた。
sed
一時、46B を出してトップに躍り出たあと、teebee さん、kaki さんに追いつかれ、並んだ。ただ、その時の stats が、
nn: 46B / 0B / 20B / 25B teebee: 46B / 0B / 22B / 23B kaki: 46B / 0B / 20B / 23B
で、どうも違いが無視できない。特に、kaki さんの stats は、white space が多すぎるので、やばいと思った。なんらか違うロジックを使っていると思われた。なので、さらに短縮できないか考えたところ、43B を思いつくことができた。
s/[2-8]/&87654321/g;s/0\|\([2-8]\)[^1]*\1/\1/g # nn@46B s/[1-9]/&0&987654321/g;s/0\(\w\)[2-9]*\1\|0//g # teebee@46B s/[1-9]/^I&9876543210/g;s/^I\(.\)[^0]*\1\|0/\1/g # kaki@46B s/[2-9]/^I&987654321/g;s/0\|^I\(.\)\w*\1/\1/g # nn@43B
案の定、3者それぞれ異なることをやっていた。特に、kaki さんの 46B は、私の 43B と方向性が同じで、タブ(^I)を使っていた。46B の段階で、一番、43B 解に近かったと言えると思う。
vi
vi は、clock さんに、1B 差で負けた。clock さんの解:
O:%s/0//ge\x1bqzdd@"P\x01yllpq9@zddZZ
これ、結構すごい。マクロで計10回処理しているが、まず初めは、
:%s/0//ge
を入力し、dd で削除したあと @" で実行し、0 を消去している。続いて、P により、再度、現在のカーソル位置の上の行にペーストして、^Ayllp により、
:%s/1/1/ge
とし、また、dd & @" で実行する。同様に、^Ayllp を繰り返すと、
:%s/2/21/ge :%s/3/321/ge :%s/4/4321/ge : : :%s/9/987654321/ge
となり、それぞれ実行して解答を得ている。122333@vi を説明した時に、「メタプログラミング」と表現したが、この解答は、さらに、「ダイナミックメタプログラミング」という感じだ。よく思いつくな、こんなの。
ABBA
JavaScript
埋め込み問題。ただ、複数行文字列を以下のようにそのまま埋め込むことができる。
print(<>A AA B B BB A AAB BAAB A</>)
これが、E4X というやつなのか。XMLのリテラル表現だ。もしかしたら、example_com に応用できるかも。
sed
sed は、c コマンドを使った埋め込みだ。
3cB 6~3cA 7cAAB 8cBAAB
面白かったのは、6~3cA の部分。この場合、6 行目と 9 行目(6+3)の代わりに A を出力するという意味。c コマンドの動き、ちょっと癖がある。たとえば、
5,6chello
は、5 行目と 6 行目が削除され、hello が一つだけ出力される。a や i コマンドだと
5,6ahello 5,6ihello
は、5 行目、6 行目にそれぞれ、計 2 個 hello が出力される。また、
5chello 6chello
とやると、5 行目、6 行目にそれぞれ、計 2 個 hello が追加出力される。manual によると、アドレスが range の場合は、c コマンドは、
output the lines of text which follow this command in place of the last line
とのことだ。
vi
vi はまたしてもclock さんの 21B 解に 1B 差で負けた。こちらもよく考えられている。ckA^[ で、2行消して A に置き換える操作を 2 回やった後に p して、2行戻すことで効率よく置換している。
〜〜〜〜〜
さて、現在アクティブな問題だと、ABBA2 の JavaScript 解、50B は、今までに無いちょっとした技を使っている。
また、replace last occurrence FIXED や prefix to postfix も sed 向きだ。後者、prefix to postfix は、Function call expression と同じような感じだ。小手先のひと工夫で、50B を出すことができ、sed が言語ランキングで暫定一位を取れている。