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 を説明した時に、「メタプログラミング」と表現したが、この解答は、さらに、「ダイナミックメタプログラミング」という感じだ。よく思いつくな、こんなの。

JavaScript

JavaScript は、

for(;;)print(readline().replace(/\d/g,function f(d)+d?d+f(d-1):''))

と、クロージャーに名前を付けて再帰呼び出しすることで、とてもコンパクトなコードになった。

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行戻すことで効率よく置換している。
〜〜〜〜〜
さて、現在アクティブな問題だと、ABBA2JavaScript 解、50B は、今までに無いちょっとした技を使っている。
また、replace last occurrence FIXEDprefix to postfixsed 向きだ。後者、prefix to postfix は、Function call expression と同じような感じだ。小手先のひと工夫で、50B を出すことができ、sed が言語ランキングで暫定一位を取れている。