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
ゴルフは全くしてないけど面倒なのでいいや。