解説 forked from: 405 <- 508 forked from: Shorten Brainf*ck Interpreter

by bkzen forked from 405 <- 508 forked from: Shorten Brainf*ck Interpreter (diff: 15)
解説 forked from: 405 <- 508 forked from: Shorten Brainf*ck Interpreter

♥2 | Line 14 | Modified 2010-07-24 02:12:15 | MIT License
play

ActionScript3 source code

/**
 * Copyright bkzen ( http://wonderfl.net/user/bkzen )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/5QQw
 */

// forked from bkzen's 405 <- 508 forked from: Shorten Brainf*ck Interpreter
// forked from Susisu's Shorten Brainf*ck Interpreter
package{
    import flash.display.Sprite;
    import flash.text.TextField;
    [SWF(width="465", height="465", backgroundColor="0xffffff", frameRate="60")]
    public class BrainfuckInterpreter extends Sprite{
        public function BrainfuckInterpreter(){
            var code:String="++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.";
            var result:TextField=new TextField();
            result.text=b(code);
            addChild(result);
        }
        //Please shorten this!
        // 405 char!
        private function b(c:*):*{var a:*=new Vector.<int>(9),r:*="",p:*,t:*,d:*=c.split(""),l:*=d.length,i:int,j:*,n:*=p=t=j=i,e:*="-+<>.][";for(;i<l;i++){n=1<<e.indexOf(d[i]),a[p]+=(n&3)&&(n|1)-2,p+=(n>>=2)&3&&(n|1)-2,r+=(n>>=2)&1?String.fromCharCode(a[p]):"",t=0;if((n>>=1)&&((n=(n|1)-2)>0?!a[p]:a[p]))for(j=i+n;n>0?j<l:j>=0;j+=n){if(d[j]==(n>0?"[":"]"))t++;if(d[j]==(n>0?"]":"[")&&!t--){i=j;break;}}}return r}
    }
}
        /*
        private function b(c:*):*
        {
            var a:*=new Vector.<int>(9),
            // 変数定義は, でつなげてvar の分をへらす。
            r:*="",p:*,t:*,d:*=c.split(""),
            l:*=d.length,i:int,
            // i だけはintで定義して その他を初期化するのに使う。
            // そうしないと0じゃなくて null とか undefined とか
            // そんな感じになる。
            j:*,n:*=p=t=j=i,
            e:*="-+<>.][";
            // +-<>なんかはeに文字列としてまとめておく。
            for(;i<l;i++)
            {
                // n は1~100000(2)の値になる。
                // 頻繁に出てくる(n&3)&&(n|1)-2 は
                // 12だけを -1 と 1 にする。その他は0になる。
                n=1<<e.indexOf(d[i]),
                a[p]+=(n&3)&&(n|1)-2,
                p+=(n>>=2)&3&&(n|1)-2,
                // n>==2 で8 -> 2、4 -> 1 にする。
                r+=(n>>=2)&1?String.fromCharCode(a[p]):"",
                // n>>=2 でさらに16 -> 1 にする。
                // ビット演算で 1のフラグだけを見て true なら rに値を追加する。
                t=0;
                // tは外で初期化させる。
                if((n>>=1)&&((n=(n|1)-2)>0?!a[p]:a[p]))
                // >>=1 でさらに 32 -> 1 64 -> 1 にする。
                for(j=i+n;n>0?j<l:j>=0;j+=n)
                {
                    if(d[j]==(n>0?"[":"]"))t++;
                    if(d[j]==(n>0?"]":"[")&&!t--)
                    {
                        // !t-- で 0 の時だけ true になる。
                        i=j;break;
                    }
                }
             }
             return r
         }*/