Brainfuck on Ruby
Brainfuck インタプリタ。
arr = [] ptr = 0 soc = ARGF.read pos = 0 while soc.size > pos print soc[pos].chr if $DEBUG p arr if $DEBUG arr[ptr] ||= 0 case soc[pos] when ?> ptr += 1 when ?< ptr -= 1 when ?+ arr[ptr] += 1 when ?- arr[ptr] -= 1 when ?. print arr[ptr].chr when ?, arr[ptr] = $stdin.getc when ?[ if arr[ptr].zero? n = 1 while n.nonzero? pos += 1 case soc[pos] when ?[ n += 1 when ?] n -= 1 end end end when ?] n = -1 while n.nonzero? pos -= 1 case soc[pos] when ?[ n += 1 when ?] n -= 1 end end pos -= 1 end pos += 1 end puts
mailto:>++++++++++[<++++++++++>-]<-. +++++. +++++++. >++++++[<---------->-]<+. +. >++[<+++++>-]<+. >++++[<++++++++++>-]<++++. +++. ++++++++. -----. -------------. ----. +++++++++++. >++++++[<---------->-]<--. >++++++[<++++++++++>-]<++++. ---------. +++++++++++++++. 途中式 もっと短くしろよとかね。知らないよ。1パターンしか使ってないしね。いやでも別にね。ね。
bfi.rb Brainfuck の Ruby 実装 ってのを見つけた。変数名以外殆ど同じ(w. 最後に puts つけてるのまで同じだ。おもろいなぁ。ちなみに最後の puts は zsh 対策です。
The Ruby BrainFuck Interpreter クラス使ってる
アルゴリズム自体は Brainf*ck で頭にいれ、テストもそのページで紹介されているプログラムを使った。
関連エントリー
- Brainfuck, 値のコピー 単純にコピーしようとしても無理みたいだ。ループカウンタは常にデクリメントされまくるので、一つの値を別のところにコピーする場合、元の値は一度破...
- ruby-xslt 0.8.2 新しくなっているのに気付いた。 ruby extconf.rb --enable-error-handler (off by default...
- DaVinci Resolve のマーカーから YouTube のチャプターを書き出した後に生成する 書き出しするとき、YouTube 設定でマーカーをチャプターにしてくれる機能がある。書き出したあとに再生成とかしたいので、どこかから普通にテ...
- Mac に RMagick がインストールできない。 $ sudo /usr/bin/xcode-select -switch /Applications/Xcode.app/Contents/...
- Ruby でネストした構造体文字列をネストした配列として unpack する Cの構造体とかだと、構造体の中に他の構造体ということは普通にあります。 こういった構造体の文字列を unpack すると、全部フラットな配列...