forked from: Project Euler 165(unsolved)

by uwi forked from Project Euler 165 (diff: 1)
♥0 | Line 75 | Modified 2009-12-05 15:57:06 | 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/kfvq
 */

// forked from uwi's Project Euler 165(unsolved)
package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.utils.getTimer;
    import flash.utils.Dictionary;
    // @see http://projecteuler.net/index.php?section=problems&id=
    public class Euler extends Sprite {
        private var _tf : TextField;
  
        public function Euler() {
            _tf = new TextField();
            _tf.width = 465;
            _tf.height = 465;
            addChild(_tf);
            
            var s : int = getTimer();
            tr(solve(5000));
            var g : int = getTimer();
            tr((g - s) + " ms");
        }

        private function solve(M : int) : Number
        {
            var t : Array = [];
            var s : Number = 290797;
            var i : int, j : int;
            for(i = 0;i < 20000;i++){
                s = (s * s) % 50515093;
                t.push(s % 500);
            }
            
            var ar : Array = [];
            /*
            for(i = 0;i < M;i++){
                for(j = i + 1;j < M;j++){
                    var ins : Array = intersect(
                        t[i<<2], t[(i<<2)+1], t[(i<<2)+2], t[(i<<2)+3],
                        t[j<<2], t[(j<<2)+1], t[(j<<2)+2], t[(j<<2)+3]
                        );
                    if(ins != null){
                        ar.push(ins);
                    }
                }
            }
            */
            for(i = 0;i < 3000000;i++)ar.push([Math.random(), Math.random()]);
            tr(ar.length);
            
            ar.sortOn(["0", "1"], Array.NUMERIC);
             
            var ct : int = 1;
            var start : int = 0;
            var same : Array = [];
            for(i = 1;i < ar.length;i++){
                if(ar[i][0] - ar[i - 1][0] > 0.00000001 ||
                ar[i][1] - ar[i - 1][1] > 0.00000001
                ){
                    start = i;
                    ct++;
                }else{
                    if(start == i - 1)same.push(ar[i-1]);
                    same.push(ar[i]);
//                    tr(i, ar[i - 1][0], ar[i][0]);
                }
            }
            
            /*
            same.sortOn("1", Array.NUMERIC);
            var start2 : int = 0;
            var same2 : Array = [];
            for(i = 1;i < same.length;i++){
                if(same[i][0] - same[i - 1][1] > 0.00000001){
                    start2 = i;
                }else{
                    if(start2 == i - 1)same2.push(same[i-1]);
                    same2.push(same[i]);
                }
            }
            
            var f : Array = new Array(same2.length);
            for(i = 0;i < same2.length;i++){
                for(j = i + 1;j < same2.length;j++){
                    if(
                    (same2[i][2]-same2[j][2])*same2[i][7]*same2[j][7]+
                    same2[i][3]*same2[i][6]*same2[j][7]-
                    same2[j][3]*same2[j][6]*same2[i][7]
                    ){
                        f[i] = true;
                        f[j] = true;
                    }
                }
            }
            
            var ctt : int = 0;
            for each(var ff : Boolean in f){
                if(ff)ctt++;
            }
            
            tr(ctt);
            */
            tr(ar.length);
            tr(same.length);
//            tr(same2.length);
//            tr(same2.join('\n'));
            return ct;
        }
       
        private function intersect(x1s : int, y1s : int, x1g : int, y1g : int, x2s : int, y2s : int, x2g : int, y2g : int) : Array
        { 
            var x1d : int = x1g - x1s;
            var y1d : int = y1g - y1s;
            var x2d : int = x2g - x2s;
            var y2d : int = y2g - y2s;
            var D : int = x1d * -y2d - y1d * -x2d;
            if(D == 0)return null; 
            
            var Ut : int = (-y2d * (x2s - x1s) + x2d * (y2s - y1s));
            var Uu : int = (-y1d * (x2s - x1s) + x1d * (y2s - y1s));
            if(D > 0){
                if(Ut <= 0 || Ut >= D)return null;
                if(Uu <= 0 || Uu >= D)return null;
            }else{
                if(Ut >= 0 || Ut <= D)return null;
                if(Uu >= 0 || Uu <= D)return null;
            } 
             
             var t : Number = Ut / D;
             var u : Number = Uu / D;
//             return [x1s+x1d*Ut/D, y1s+y1d*Ut/D, x1s, x1d, y1s, y1d, Ut, D];
             return [x1s+x1d*Ut/D, y1s+y1d*Ut/D];//, x1s, x1d, y1s, y1d, Ut, D];
        }
           
        private function tr(...o : Array) : void
        {
            _tf.appendText(o + "\n");
        }
    }
}