Project Euler 260

by uwi
@see http://projecteuler.net/index.php?section=problems&id=260
♥0 | Line 105 | Modified 2009-10-19 07:04:47 | 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/m9Zu
 */

package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import com.bit101.components.*;
    import flash.events.*;
    import flash.utils.getTimer;
    // @see http://projecteuler.net/index.php?section=problems&id=260
    public class Euler260 extends Sprite {
        private var _tf : TextField;
  
        // (x, y, z)の必勝を判定するとき、
        // (x-u,y,z), (x,y-u,z), (x,y,z-u),
        // (x-u,y-u,z), (x,y-u,z-u), (x-u,y,z-u),
        // (x-u,y-u,z-u) (uは任意の自然数)のどれかが必敗になると
        // 必勝になってしまうので、この7つのラインそれぞれの上では、
        // 必敗はたかだか1つしかない。それを利用する。
        // 
        // コード中のkのループでは、必敗と判定した後はすべて必勝なので
        // breakしている
        public function Euler260() {
            _tf = new TextField();
            _tf.width = 465;
            _tf.height = 465;
            addChild(_tf);
            
            var pb : PushButton = new PushButton(this, 350, 10);
            pb.label = "stop";
            pb.width = 100;
            pb.addEventListener(MouseEvent.CLICK, function(e : MouseEvent) : void
            {
                removeEventListener(Event.ENTER_FRAME, onEnterFrame);
            });
            
            _s = getTimer();
            solve(1000);
        }
        
        private var _e11 : Object;
        private var _e12 : Object;
        private var _e13 : Object;
        private var _e21 : Object;
        private var _e22 : Object;
        private var _e23 : Object;
        private var _e3 : Object;
        private var N : int; 
        private var _i : int;
        private var _s : int;
        private var ret : Number;

        private function solve(M : int) : void
        {
            N = M + 1;
            _e11 = {};
            _e12 = {};
            _e13 = {};
            _e21 = {};
            _e22 = {};
            _e23 = {};
            _e3 = {};
            
            ret = 0;
            _i = 0;
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }
        
        private function onEnterFrame(e : Event) : void
        {
//            for(var i : int = 0;i <= M;i++){
                for(var j : int = 0;j < N;j++){
                    for(var k : int = 0;k < N;k++){
                        if(!dfs(_i, j, k)){
                            if(_i <= j && j <= k)ret += _i + j + k;
                            break;
//                            tr(i, j, k);
                        }
                    }
                }
//            }
            if(_i % 40 == 0){
                tr(_i, ret, (getTimer() - _s) + " ms");
            }
            if(_i == N - 1){
                tr("solved!");
                tr(ret, (getTimer() - _s) + " ms");
                removeEventListener(Event.ENTER_FRAME, onEnterFrame);
            }
            _i++;
        }
        
        private function dfs(x : int, y : int, z : int) : Boolean
        {
            var c11 : int = y * N + z;
            if(_e11[c11])return true;
            var c12 : int = z * N + x;
            if(_e12[c12])return true;
            var c13 : int = x * N + y;
            if(_e13[c13])return true;
            var c21 : int = x * (2 * N) + (z - y);
            if(_e21[c21])return true;
            var c22 : int = y * (2 * N) + (x - z);
            if(_e22[c22])return true;
            var c23 : int = z * (2 * N) + (y - x);
            if(_e23[c23])return true;
            var c3 : int = (y - x) * (2 * N) + (z - x);
            if(_e3[c3])return true;
            
            _e11[c11] = 1;
            _e12[c12] = 1;
            _e13[c13] = 1;
            _e21[c21] = 1;
            _e22[c22] = 1;
            _e23[c23] = 1;
            _e3[c3] = 1;
            return false;
        }
        
        private function makeCode(i : int, j : int, k : int) : int
        {
            var a : Array = [i, j, k];
            a.sort();
            return (a[0] * N + a[1]) * N + a[2];
        }

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