PythonによるBrainf*ckインタプリタ
Brainf*ckの説明はこちら:http://ja.wikipedia.org/wiki/Brainfuck
http://www.kmonos.net/alang/etc/brainfuck.php
コードに空白やコメントを入れられるようにしてみた。
compileメソッドを呼ぶと空白やコメントを取り除く。
(このソースコードには最新版があります。PythonによるBrainf*ckインタプリタ 1.01を参照してください。)
bf = BFInterpreter()
bf.compile("""
>+++++++++[<++++++++>-]<.
>+++++++[<++++>-]<+.
+++++++.
.
+++.
[-]>++++++++[<++++>-]<.
>+++++++++++[<+++++>-]<.
>++++++++[<+++>-]<.
+++.
------.
--------.
[-]>++++++++[<++++>-]<+.
[-]++++++++++.
""")
bf.runCode()
これを実行すると「Hello, World!」と出る。
Comments
...
by
reli
@2005-09-12 15:54
結構おもしろい言語ですね。使いものにはならないけど...
ところで、
>def stepCode(self):
> c = code[self.caret]
> self.command[c]()
は、c=self.code[self.caret]
じゃないですか?
code = bf.codeを求めているならいいんだけど。
...
by
nishio
@2005-09-13 04:32
ああ。修正しときました。
個人的には「bfでメモリ0番地に整数Nを入れて表示するために必要なステップ数はいくらか。ただし1番以降のメモリは作業用に破壊してかまわない。」という問題が結構面白そうに感じる。
n個の+の羅列を(+n)と表記することにすれば「>(+n)[ < (+m) > -](+c)」でn*m+cを作れるので m * n > m + n + 6 が成立させられる m + n = 8以上ではこの構文を使うほうが短い。ここまでは引用元のソースから読み取れる。問題はどういうタイミングでさらなる掛け算を使うか、ということですな。
んっと。これ同じことの繰り返しか。いや、違うな。
メモリ1番地を作業領域に使うわけだから、掛け算の片方に関してはさらに掛け算をすることが出来るけども、もう片方は作業領域の取り方を変えないと衝突してしまうか。あと、きれいな掛け算にならないときにどうやって調節するかも問題か…。
...
by
nishio
@2005-09-25 17:19
今、このインタプリタが括弧のネストに対応していないことに気がついた。
このページは静的なアーカイブなので新しいコメントは受け付けておりません。ご意見ご感想はお気軽にメールでどうぞ。coreblog「あっとまーく」nishiohirokazu.org。
Trackbacks