Project Euler 164

by uwi
@see http://projecteuler.net/index.php?section=problems&id=164
♥0 | Line 50 | Modified 2009-07-21 18:13:08 | 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/tx0k
 */

package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.utils.getTimer;
    // @see http://projecteuler.net/index.php?section=problems&id=164
    public class Euler164 extends Sprite {
        private var _tf : TextField;
  
        public function Euler164() {
            _tf = new TextField();
            _tf.width = 465;
            _tf.height = 465;
            addChild(_tf);
            
            var s : int = getTimer();
            _tf.appendText("" + solve() + "\n");
            var g : int = getTimer();
            _tf.appendText("" + (g - s) + " ms\n");
        }
        
        private var _cache : Array;
        
        private function solve() : Number
        {
            _cache = new Array(20);
            for(var i : int = 0;i < 20;i++){
                _cache[i] = new Array(10);
                for(var j : int = 0;j < 10;j++){
                    _cache[i][j] = new Array(10);
                    for(var k : int = 0;k < 10;k++){
                        _cache[i][j][k] = 0;
                    }
                }
            }
            
            var ret : Number = 0;
            for(var a : int = 1;a <= 9;a++){
                for(var b : int = 0;b <= 9;b++){
                    ret += rec(2, a, b);
                }
            }
            return ret;
        }
        
        private function rec(d : int, a : int, b : int) : Number
        {
            if(d == 20)return 1;
            if(_cache[d][a][b] > 0)return _cache[d][a][b];
            
            var ret : Number = 0;
            for(var c : int = 0;c <= 9;c++){
                if(a + b + c <= 9)ret += rec(d + 1, b, c);
            }
            _cache[d][a][b] = ret;
            return ret;
        }
    }
}