brainfuck から Grass への変換器を書いてみました。brainfuck はできるけど、Grass はちょっと……という人向け。 # brainfuck のプログラム $ cat hello.bf +++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-. ------------.<++++++++.--------.+++.------.--------.>+. # grass のプログラムに変換 $ ruby19 braingrass.rb hello.bf > hello.www # 実行 $ ruby19 yagi.rb hello.www; echo Hello, world!ソースはこちら。 http://github.com/mame/grass-misc/tree/master/braing
Ruby 1.9 の新機能のひとつに「lambda { ... } を -> { ... } と書ける」というのがあります。この表記は反対意見が根強い *1 ですが、確実にすばらしい点があって、全部記号だということです。これによって Ruby が記号だけでチューリング完全になります *2 。 デモとして、brainfuck インタプリタを記号だけで書いてみました。 $___,@_,@__,$_=(@@__="")=~//,?#=~/$/,->(_){_<(__="####"=~/$/)**__&&(@@__<< _;@__[_+@_])},[*$<]*@@__;@__[$___];$____,$_,@___,$__,@__=$_[@_+($_+?!=~/!/ )..-@_],$`,[],[],->(_){(__=$_[_];__=~/[><+\-\.,]/?$__<<$_[_]:__==?
Rubyfuck というライブラリを作ってみました。以下の美しい Ruby のプログラムは Hello, world! を出力します。 Rubyfuck.new do |_| _.+_.+_.+_.+_.+_.+_.+_.+_.+_.+_[ _.>_.+_.+_.+_.+_.+_.+_.+_.>_.+_.+_. +_.+_.+_.+_.+_.+_.+_.+_.>_.+_.+_.+_.>_.+_.<_.<_.<_.<_.-_]._.>_.+_.+_. /_.>_.+_./_.+_.+_.+_.+_.+_.+_.+_./_./_.+_.+_.+_./_.>_.+_.+_./_.<_.<_. +_.+_.+_.+_.+_.+_.+_.+_.+_.+_.+_.+_.+_.+_.+_./_.>_./_.+_.+_.+_./_.-_. -_.-_.-_.-_.-_./_.-_.-_.-_.-_.-_.
数学ゴルフが終了したようです。僕の解答も niha さんのと同じです。それはともかく、数学ゴルフの言語の入出力拡張版*1を提案されていました。とりあえず turing 完全であることを確かめるため brainfuck インタプリタを書こうと思ったのですが、面倒だったので brainfuck から数学ゴルフへの変換を定義してみました。 テープのエンコード 僕も変数の数は有限な方がかっこいいと思うので、テープをエンコードするために多倍長倍数を使うことにしました。テープ上の各セルは 1 バイトとして、以下の 3 変数でエンコードします。 l : ポインタ位置より左側の数字を多倍長で表現する m : ポインタ位置の数字を表現する r : ポインタ位置より右側の数字を多倍長で表現する 例えばテープが [1, 2, 3, 4, 5, 6, 7] で、ポインタが 4 の位置を指している状態は l = 3
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く