NULL::something

Login via flickr, はてな, TypeKey.

2006-01-16

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 で頭にいれ、テストもそのページで紹介されているプログラムを使った。

Inserted at 2006-01-18T12:05:01+09:00

Comments (0)

Trackback URI: http://lowreal.net/logs/2006/01/16/4.trackback

NULL

RSS feed meter for http://lowreal.net/logs/latest

Alternates

  1. RSS 1.0
  2. Atom 1.0

Generated with Taglibro

この日記は Taglibro と呼ばれる XML ベースの XSLT をテンプレートとして使ったシステムを使っています。現在の Taglibro は Ruby, ruby-xslt, libxml-ruby による実装です。ソースコードはとりあえず公開していません。