198letters - forked from BrainF*ck interpreter challenge

by shohei909 forked from BrainF*ck interpreter challenge (diff: 36)
解読しながら、()を消したり

2011/06/03 
259->198letters
♥1 | Line 36 | Modified 2011-06-03 18:57:25 | MIT License
play

ActionScript3 source code

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

// forked from keim_at_Si's BrainF*ck interpreter challenge
package {
    import flash.system.IME;
    import flash.events.*;
    import flash.display.*;
    import com.bit101.components.*;
    
    public class BFInterpreter extends Sprite {
        
        
        
        
// my brainf*ck interpreter (currently in 198 letters) ----------------------------------------------------------------------------------------------------
// b : sourceChars
// i : inputChars
// c : command
// x : pointer
// p : position
// o : output
// l : ['s position
//259letters function $(b,i){for(var s=[0],x=0,o=[],l=[],c,k,p=0;c=b[p];p++)if((c<44?s[x]++:c<45?s[x]=i.shift()?0:(p=-9):c<46?--s[x]:c<47?o.push(s[x]):c<61?--x:c<63?s[++x]||=0:c<92?s[x]?l.push(p):b:c<94?p=l.pop()-1:0)==b)for(k=1;c=k&&b[++p];)k-=c>90&&c<94?c-92:0;return o}
//225letters function $(b,i){for(var s=[0],x=0,o=[],l=[],c,k=0,p=0;c=b[p];p++)k<1?c>92?p=l.pop()-1:c>90?s[x]?l.push(p):k=1:c<44?s[x]++:c<45?s[x]=i.shift()?0:(p=-9):c<46?--s[x]:c<47?o.push(s[x]):c<61?--x:s[++x]||=0:k-=c>90?c-92:0;return o}
//210letters function $(b,i){for(var s=[0],x=0,o=[],c,k,p=-1;c=b[k<0?p--:++p];)k?k-=c>90?c-92:0:c>92?p+=k=-1:c>90?s[x]?0:k=1:c<44?s[x]++:c<45?s[x]=i.shift()?0:p=-9:c<46?--s[x]:c<47?o.push(s[x]):c<61?--x:s[++x]||=0;return o}
//198letters 
function $(b,i){for(var s=[0],x=0,o=[],c,k,p=-1;c=b[k<0?p--:++p];)k?k-=c>90?c-92:0:c>92?p+=k=-1:c>90?s[x]?0:k=1:c-44?c<46?s[x]+=44-c:c<47?o.push(s[x]):s[x+=c-61]||=0:s[x]=i.shift()||(p=-9);return o}
/*function $(b,i){
    for(var s=[0],x=0,o=[],c,k,p=-1;c=b[k<0?p--:++p];)
        k?
            k-=c>90?c-92:0
        :
            c>90?
                c<92==!s[x]?p+=k=92-c:0
            :c-44?
                c<46?
                    s[x]+=44-c
                :c<47?
                    o.push(s[x])
                :
                    s[x+=c-61]||=0
            :
                s[x]=i.shift()||(p=-9);
     return o
}
//*/
        
        
        
        
// User Interface ----------------------------------------------------------------------------------------------------
        function BFInterpreter() { addEventListener(Event.ADDED_TO_STAGE, _setup); }
        
        private function _setup(event:Event) : void {
            event.target.removeEventListener(event.type, arguments.callee);
            _source = _newTextArea("source :", 20,  200);
            _input  = _newTextArea("input :",  240, 18);
            _output = _newTextArea("output :", 280, 160);
            new PushButton(this, 132, 221, "execute", _execute).setSize(200, 18);
            
            // Hello, world! (72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33)
            _source.text = "+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.------------.<++++++++.--------.+++.------.--------.>+.";
        }
        
        private function _newTextArea(label:String, ypos:Number, height:Number) : TextArea {
            var textArea:TextArea = new TextArea(this, 32, ypos);
            textArea.setSize(400, height);
            new Label(this, 32, ypos-20, label);
            return textArea;
        }
        
        private function _execute(event:Event) : void {
            var sourceCode:String, sourceChars:Array=[], inputChars:Array=[], outputChars:Array, i:int;
            
            // translate input text to char[]
            sourceCode = _source.text.replace(/[^<>+\-.,[\]]/gm, "");
            for (i=0; i<sourceCode.length;  i++) sourceChars.push(sourceCode.charCodeAt(i));
            for (i=0; i<_input.text.length; i++) inputChars.push(_input.text.charCodeAt(i));
            // null for the end of char[]
            sourceChars.push(0);
            inputChars.push(0);
            
            // execute interpreter
            outputChars = $(sourceChars, inputChars);
            
            // translate output char[] to text
            for (i=0; i<outputChars.length; i++) _output.text += String.fromCharCode(outputChars[i]);
            _output.text += "\n";
        }

        private var _source:TextArea, _input:TextArea, _output:TextArea;
    }
}