Project Euler 150

by uwi
@see http://projecteuler.net/index.php?section=problems&id=150
♥0 | Line 80 | Modified 2009-10-18 11:20:48 | 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/ztn1
 */

package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.utils.getTimer;
    import flash.events.*;
    import com.bit101.components.*;
    // @see http://projecteuler.net/index.php?section=problems&id=150
    public class Euler150 extends Sprite {
        private var _tf : TextField;
  
        public function Euler150() {
            _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);
            });
            
            var s : int = getTimer();
            solve();
            var g : int = getTimer();
            t((g - s) + " ms");
        }
        
        private var s : Array;
        private var min : Number;
        private var bottoms : Array;
        private var l : int;

        private function solve() : void
        {
            var i : int, j : int, k : int;
            s = new Array(500501);
            var T : int = 0;
            for(k = 0;k < 500500;k++){
                T = (615949 * T + 797807) % 1048576;
                s[k] = T - 524288;
            }
            
            min = s[0];
            bottoms = [[]];
            l = 1;
            
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }
        
        private function onEnterFrame(e : Event) : void
        {
            var newbottoms : Array = new Array(l);
            var i : int, j : int;
            for(i = 0;i < l;i++)newbottoms[i] = [];
            
            var bsums : Array = [];
            
            var base : int = l * (l - 1) / 2;
            var sum : Number = 0;
            for(i = 0;i < l;i++){
                sum += s[base + i];
                bsums[i] = sum;
            }
            bsums[-1] = 0;
            
            for(i = 0;i < l;i++){
                newbottoms[i][i] = s[base + i];
                if(newbottoms[i][i] < min)min = newbottoms[i][i];
//                    var ni : Array = newbottoms[i];
                for(j = i + 1;j < l;j++){
                    newbottoms[i][j] = bottoms[i][j - 1] + bsums[j] - bsums[i - 1];
                    if(newbottoms[i][j] < min)min = newbottoms[i][j];
//                        ni[j] = bottoms[i][j - 1] + bsums[j] - bsums[i - 1];
//                        if(ni[j] < min)min = ni[j];
                }
            }
            
            bottoms = newbottoms;
            
            if(l == 1000){
                /*
                for(i = 1;i <= 8;i++){
                    var aaa : Array = [];
                    for(j = (i - 1) * i / 2;j < i * (i + 1) / 2;j++){
                        aaa.push(s[j]);
                    }
                    t(aaa);
                }
                */
                t(min);
                removeEventListener(Event.ENTER_FRAME, onEnterFrame);
            }
            if(l % 40 == 0){
                t([l, min]);
            } 
            l++;
        }

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