Project Euler 150
@see http://projecteuler.net/index.php?section=problems&id=150
♥0 |
Line 80 |
Modified 2009-10-18 11:20:48 |
MIT License
archived:2017-03-30 04:47:18
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");
}
}
}