読者です 読者をやめる 読者になる 読者になる

回文

http://d.hatena.ne.jp/TAKESAKO/20100519/1274240074

回文ってのは一行コメントある言語だとゴルフでもしない限り自明すぎてどうでもいいわけですけど、一行コメントが無い言語とかだとそれなりに面白くて、 OCaml なんかだと ksk さんが \ をうまく使っておられたりとか。

http://d.hatena.ne.jp/KeisukeNakano/20070602/1180788051

ゴルフになるとひっくりかえした方にも意味を持たせたいものですが、しかしそんなことは普通のプログラムだとほぼ不可能(機械語ならちょっとくらいならできそう)だと思うんですが、 Quine だとどうせプログラム本文をまるっと埋め込む必要が出てくることから、逆向いてる方にそっちの役割をしてもらっているこういうヤツとかは面白いなぁと思いました。

http://golf.shinh.org/reveal.rb?Palindromic+Quine/hinoe_1202560632&c

あとはフラたんの Palindromic Alnum Quine in Ruby とかは大変素敵です。

http://golf.shinh.org/reveal.rb?Palindromic+Quine/flagitious%28alnum%29_1222612526&rb

そういえば Brainfuck を回文化するのってどうなのかなーと考えてみて、 Hello, world! くらいなら割と自明に簡単に書けることに気付きました。

s = "Hello, world!\n"
bf = ''
7.times{|i|
  bf += '+' * s[i] + '.' + '+' * s[-i-1] + '>'
}
code = bf + bf[0..-2].reverse
raise if code != code.reverse
puts code

こんな感じで。

% beef =(ruby palin_bf.rb)
Hello, world!

で任意のプログラム書けるかっていう話なんですが、 valid だと感じられる範囲で考えると、これはまぁできないんじゃないかなぁと思います。 [ ] を左で使うとどうしても ] [ が出てきてしまうので。

しかしまぁ、世の Brainfuck インタプリタは差してるメモリが正の時は開き括弧に対応する閉じ括弧のチェックとか別にしないんじゃないかなぁ…と考えると、

[[[[+書きたいコードの反転]]]][[[[]]]]書きたいコード+[[[[

と書けばいいじゃないか、と気付いたのでした。

というわけで Palindromic Quine を Brainfuck で解いてみました。生成したコードは ksk さんにのパクリです。

# based on http://d.hatena.ne.jp/KeisukeNakano/20070626/1182879045

# usage: beef =(ruby palin_bf_q.rb) > palin_quine.bf

hash = {
  '+'=>'>>',
  '-'=>'>++>',
  '.'=>'>+++>',
  '<'=>'>+>+',
  '>'=>'>+++>+',
  '['=>'>>+++',
  ']'=>'>++>+++',
}
code='+[[>>+[>]+>+[<]<-]>>[>]<+<+++[<]<<+]>>>[>]+++>+>+++>++++>+++>++++>+++>++++>+++>++++>+>++++>+>++++[<]+<+<++++<+<++++<+<++++<+<++++<+[>]<[+[<++++++++++++++++>-]<++++++++++<]>[.>>]<<[.<<]'

# for golf server.
#code='++++++++++.[-]'+code

quine=code.reverse.gsub(/./){hash[$&]}
print '-'+quine+code

ゴルフは全くしてないけど面倒なのでいいや。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h