Project Euler 195

by uwi
@see http://projecteuler.net/index.php?section=problems&id=195
♥0 | Line 90 | Modified 2010-08-14 00:39:07 | 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/cXKN
 */

package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.utils.getTimer;
    // @see http://projecteuler.net/index.php?section=problems&id=195
    public class Euler195 extends Sprite {
        private var _tf : TextField;
  
        public function Euler195() {
            _tf = new TextField();
            _tf.width = 465;
            _tf.height = 465;
            addChild(_tf);
            
            var s : int = getTimer();
            tr(solve(100));
//            tr(solveNaive(10));
            var g : int = getTimer();
            tr((g - s) + " ms");
        }

        private function solve(N : uint) : Number
        {
            this.N = N;
            _ct = 0;
//            sbrec(0, 1, 1, 2);
            
            var q : Array = [[0, 1, 1, 2]];
            while(q.length > 0){
                var param : Array = q.pop();
                var sn : uint = param[0];
                var sd : uint = param[1];
                var en : uint = param[2];
                var ed : uint = param[3];
                var mn : uint = sn + en;
                var md : uint = sd + ed;
                var xx : Number = N / ((md - 2 * mn) * (md + mn) * Math.sqrt(3) / 6);
                if(xx >= 1 / 3){
                    var a : uint = md * (md - 2 * mn);
                    var b : uint = md * md - mn * mn;
                    var c : uint = md * md - mn * md + mn * mn;
                    if((mn + md) % 3 != 0){
    //                    tr(mn, md, a, b, c);
                        _ct += int(xx);
                    }else{
    //                    tr(mn, md, a/3, b/3, c/3, "/3");
                        _ct += int(xx * 3);
                    }
                    q.push([sn, sd, mn, md]);
                    q.push([mn, md, en, ed]);
                }
            }
            
            return _ct;
        }
        
        public var N : Number;
        private var _ct : uint;
        
        private function sbrec(sn : uint, sd : uint, en : uint, ed : uint) : void
        {
            var mn : uint = sn + en;
            var md : uint = sd + ed;
            var xx : Number = N / ((md - 2 * mn) * (md + mn) * Math.sqrt(3) / 6);
            if(xx >= 1 / 3){
                var a : uint = md * (md - 2 * mn);
                var b : uint = md * md - mn * mn;
                var c : uint = md * md - mn * md + mn * mn;
                if((mn + md) % 3 != 0){
//                    tr(mn, md, a, b, c);
                    _ct += int(xx);
                }else{
//                    tr(mn, md, a/3, b/3, c/3, "/3");
                    _ct += int(xx * 3);
                }
                sbrec(sn, sd, mn, md);
                sbrec(mn, md, en, ed);
            }
        }

/*        
        private function sbrec2(sn : uint, sd : uint, en : uint, ed : uint) : void
        {
            var mn : uint = sn + en;
            var md : uint = sd + ed;
            var xx : Number = N / ((2 * mn - md) * (md - mn) * Math.sqrt(3) / 2);
            if(xx >= 1){
                var a : uint = md * (2 * mn - md);
                var b : uint = md * md - mn * mn;
                var c : uint = md * md - mn * md + mn * mn;
//                tr(mn, md, a, b, c);
                if((mn + md) % 3 != 0){
//                    tr(mn, md, a, b, c, mn * (md - mn) * Math.sqrt(3) / 2);
                    tr(mn, md, a, b, c);
                    _ct += int(xx);
                }else{
                    tr(mn, md, a/3, b/3, c/3, "/3");
//                    tr(mn, md, a/3, b/3, c/3, mn * (md - mn) / 3 * Math.sqrt(3) / 2, "ooo");
                    _ct += int(xx * 3);
                }
                sbrec2(sn, sd, mn, md);
                sbrec2(mn, md, en, ed);
            }
        }
*/        
        private function solveNaive(N : uint) : uint
        {
            var ct : uint = 0;
            for(var a : uint = 1;a <= 3000;a++){
                for(var b : uint = a + 1;b <= 3000;b++){
                    var cn : Number = Math.sqrt(a * a + b * b - a * b);
                    if(int(cn) == cn){
                        var c : uint = cn;
                        var S : Number = a * b * Math.sqrt(3) / 2 / (a + b + c);
                        if(S <= N){
                            tr(a, b, c);
                            ct++;
                        }
//                        ct++;
                    }
                }
            }
            return ct;
        }


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