Project Euler 166

by uwi
@see http://projecteuler.net/index.php?section=problems&id=166
♥0 | Line 73 | Modified 2009-08-04 00:49:05 | 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/3ocB
 */

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

        // 2つの対角線を最初に決めてしまうと、
        // 残りは、4要素に対して4つの式がある状態が独立に2個できる。
        // 条件下での4要素の取り得る個数を先に計算しておいて、
        // あとは対角線の要素でループ
        // O(10^7)
        private function solve() : Number
        {
            var s22 : Array = new Array(19 * 19 * 19);
            var i : int, j : int, k : int, a : int;
            for(i = 0;i <= 18;i++){
                for(j = 0;j <= 18;j++){
                    for(k = 0;k <= 18;k++){
                        var ct : int = 0;
                        for(a = 0;a <= 9;a++){
                            var b : int = i - a;
                            var c : int = k - a;
                            var d : int = j - c;
                            if(b >= 0 && b <= 9 && c >= 0 && c <= 9 && d >= 0 && d <= 9)ct++;
                        }
                        s22[(i * 19 + j) * 19 + k] = ct;
                    }
                }
            }
            
            // d1 * * e1
            // * d2 e2 * 
            // * e3 d3 * 
            // e4 * * d4
            var d1 : int, d2 : int, d3 : int, d4 : int;
            var e1 : int, e2 : int, e3 : int, e4 : int;
            var c1 : int, c2 : int, c3 : int, c4 : int;
            var code : int, s1 : int, s2 : int;
            var gct : Number = 0;
            for(d1 = 0;d1 <= 9;d1++){
            for(d2 = 0;d2 <= 9;d2++){
            for(d3 = 0;d3 <= 9;d3++){
            for(d4 = 0;d4 <= 9;d4++){
            for(e1 = 0;e1 <= 9;e1++){
            for(e2 = 0;e2 <= 9;e2++){
            for(e3 = 0;e3 <= 9;e3++){
                e4 = d1 + d2 + d3 + d4 - e1 - e2 - e3;
                if(e4 < 0 || e4 > 9)continue;
                var s : int = d1 + d2 + d3 + d4;
                
                c1 = s - d1 - e1;
                c2 = s - d4 - e4;
                c3 = s - d2 - e3;
                c4 = s - d3 - e2;
                if(c1 + c2 != c3 + c4)continue;
                code = (c1 * 19 + c2) * 19 + c3;
                s1 = s22[code];
                
                c1 = s - d2 - e2;
                c2 = s - d3 - e3;
                c3 = s - d1 - e4;
                c4 = s - d4 - e1;
                if(c1 + c2 != c3 + c4)continue;
                code = (c1 * 19 + c2) * 19 + c3;
                s2 = s22[code];
                
                gct += s1 * s2;
            }}}}}}}
            return gct;
        }

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