Project Euler 185 (MCMC)

by uwi
ストップ機構をつけていないので、つけっぱだと大変なことになります
♥0 | Line 107 | Modified 2009-09-25 06:13:17 | MIT License
play

ActionScript3 source code

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

// forked from uwi's flash on 2009-9-22
// ストップ機構をつけていないので、つけっぱだと大変なことになります
package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.text.TextField;
    import flash.utils.getTimer;
    // @see http://projecteuler.net/index.php?section=problems&id=185
    public class Euler185 extends Sprite {
        private var _tf : TextField;
  
        public function Euler185() {
            _tf = new TextField();
            _tf.width = 465;
            _tf.height = 465;
            addChild(_tf);
            
            var s : int = getTimer();
            tr(solve());
            var g : int = getTimer();
            tr((g - s) + " ms");
        }
        
        private var _d : Array;
        private var _left : Array;
        
        private var _cur : Array;
        private var _tcur : Number;
        
        private function solve() : int
        {
            var i : int, j : int;
            _d = new Array(16 * _guesses.length);
            for(j = 0;j < _guesses.length;j++){
                for(i = 0;i < 16;i++){
                    _d[j * 16 + i] = int(_guesses[j][0].charAt(i));
                }
            }
            _left = new Array(_guesses.length);
            for(i = 0;i < _left.length;i++)_left[i] = _guesses[i][1];
            
            _cur = new Array(16);
            for(i = 0;i < 16;i++){
                _cur[i] = int(Math.random() * 10);
            }
            
            _tcur = temp(_cur);
            
//            addEventListener(dol.type, rep);
            addEventListener(Event.ENTER_FRAME, rep);
//            rep();
            
            return 0;
        }
        
        private var dol : Event = new Event("doLater");
        
        private function rep(e : Event = null) : void
        {
            removeEventListener(Event.ENTER_FRAME, rep);
            
            var j : int;
            for(j = 0;j < 10000;j++){
                var nexi : int = Math.random() * 16;
                var nex : int = Math.random() * 10;
                var prev : int = _cur[nexi];
                _cur[nexi] = nex;
                var tnex : Number = temp(_cur);
                if(tnex == 1.0){
                    tr(_cur);
                    return;
                }
                
                var div : Number = tnex / _tcur;
                if(Math.random() < div){
//                if(div > 1.0){
                    _tcur = tnex;
                }else{
                    _cur[nexi] = prev;
                }
            }
            tr(_tcur);
            
            addEventListener(Event.ENTER_FRAME, rep);
        }
        
        private function temp(a : Array) : Number
        {
            var sum : int = 0;
            for(var i : int = 0;i < _guesses.length;i++){
                var psum : int = 0;
                for(var j : int = 0;j < 16;j++){
                    if(_d[i * 16 + j] == a[j])psum++;
                }
                sum += (psum - _left[i]) * (psum - _left[i]);
            }
            return Math.exp(-sum * 2);
        }
        
        private var _guesses : Array = [
["5616185650518293",2],
["3847439647293047",1],
["5855462940810587",3],
["9742855507068353",3],
["4296849643607543",3],
["3174248439465858",1],
["4513559094146117",2],
["7890971548908067",3],
["8157356344118483",1],
["2615250744386899",2],
["8690095851526254",3],
["6375711915077050",1],
["6913859173121360",1],
["6442889055042768",2],
["2321386104303845",0],
["2326509471271448",2],
["5251583379644322",2],
["1748270476758276",3],
["4895722652190306",1],
["3041631117224635",3],
["1841236454324589",3],
["2659862637316867",2]
        ];

	private function tr(...o : Array) : void
	{
            _tf.appendText(o + "\n");
	}
    }
}