Ruby 1.9 の新機能のひとつに「lambda { ... } を -> { ... } と書ける」というのがあります。この表記は反対意見が根強い *1 ですが、確実にすばらしい点があって、全部記号だということです。これによって Ruby が記号だけでチューリング完全になります *2 。

デモとして、brainfuck インタプリタを記号だけで書いてみました。

$___,@_,@__,$_=(@@__="")=~//,?#=~/$/,->(_){_<(__="####"=~/$/)**__&&(@@__<< _;@__[_+@_])},[*$<]*@@__;@__[$___];$____,$_,@___,$__,@__=$_[@_+($_+?!=~/!/ )..-@_],$`,[],[],->(_){(__=$_[_];__=~/[><+\-\.,]/?$__<<$_[_]:__==?[?(@___, $__=$__,[]):__==?]?$__=@___<<$__:__==$\?$\:_)&&@__[_+@_]};@__[$___];@___, $_,@@_,@__=[],[],$___,->(_){$_[@@_]||=$___;({?>=>->{@@_+=@_},?<=>->{@@_-= @_},?+=>->{$_[@@_]+=@_},?-=>->{$_[@@_]-=@_},?.=>->{$><<@@__[$_[@@_]]},?,=> ->{$____=~/^./&&($____=$';$_[@@_]=@@__=~/#{((__,=[*?/..?:]&[$&];__)||(__,= [*?@...?[]&[$&];__)||(__,=[*?`...?{]&[$&];__))&&__!=?{?$&:'\\'+$&}/)},$\=> ->{$\}}[$__[_]]||->{$_[@@_]!=$___&&(@___<<[$__,_-@_];$__=$__[_];@__[$___] *@___,($__,_)=@___);""})[]&&@__[_+@_]};@__[$___]

このとおり。

$ cat hello.bf +++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-. ------------.<++++++++.--------.+++.------.--------.>+. $ ./ruby punctfuck.rb hello.bf; echo Hello, world!

プロの記号ゴルファーには常識かもしれませんが、ポイントだけ紹介します。

数字を作る方法 String#=~ を使っています。このメソッドは正規表現がマッチした先頭位置を返します。なので 1 を作るためには " # " =~ /$/ とかします。

標準入力を読む方法 $< が標準入力の IO です (正確には ARGF) 。

$ 1.9 では [*ary] で ary.to_a と同じような効果があります。 Array#* は Array#join と同じです。

以上をまとめて、 [* $< ]* "" で $