Project Euler 185 (MCMC)
ストップ機構をつけていないので、つけっぱだと大変なことになります
♥0 |
Line 107 |
Modified 2009-09-25 06:13:17 |
MIT License
archived:2017-03-30 04:49:28
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/z3aZ
*/
// forked from uwi's flash on 2009-9-22
// ストップ機構をつけていないので、つけっぱだと大変なことになります
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
import flash.utils.getTimer;
// @see http://projecteuler.net/index.php?section=problems&id=185
public class Euler185 extends Sprite {
private var _tf : TextField;
public function Euler185() {
_tf = new TextField();
_tf.width = 465;
_tf.height = 465;
addChild(_tf);
var s : int = getTimer();
tr(solve());
var g : int = getTimer();
tr((g - s) + " ms");
}
private var _d : Array;
private var _left : Array;
private var _cur : Array;
private var _tcur : Number;
private function solve() : int
{
var i : int, j : int;
_d = new Array(16 * _guesses.length);
for(j = 0;j < _guesses.length;j++){
for(i = 0;i < 16;i++){
_d[j * 16 + i] = int(_guesses[j][0].charAt(i));
}
}
_left = new Array(_guesses.length);
for(i = 0;i < _left.length;i++)_left[i] = _guesses[i][1];
_cur = new Array(16);
for(i = 0;i < 16;i++){
_cur[i] = int(Math.random() * 10);
}
_tcur = temp(_cur);
// addEventListener(dol.type, rep);
addEventListener(Event.ENTER_FRAME, rep);
// rep();
return 0;
}
private var dol : Event = new Event("doLater");
private function rep(e : Event = null) : void
{
removeEventListener(Event.ENTER_FRAME, rep);
var j : int;
for(j = 0;j < 10000;j++){
var nexi : int = Math.random() * 16;
var nex : int = Math.random() * 10;
var prev : int = _cur[nexi];
_cur[nexi] = nex;
var tnex : Number = temp(_cur);
if(tnex == 1.0){
tr(_cur);
return;
}
var div : Number = tnex / _tcur;
if(Math.random() < div){
// if(div > 1.0){
_tcur = tnex;
}else{
_cur[nexi] = prev;
}
}
tr(_tcur);
addEventListener(Event.ENTER_FRAME, rep);
}
private function temp(a : Array) : Number
{
var sum : int = 0;
for(var i : int = 0;i < _guesses.length;i++){
var psum : int = 0;
for(var j : int = 0;j < 16;j++){
if(_d[i * 16 + j] == a[j])psum++;
}
sum += (psum - _left[i]) * (psum - _left[i]);
}
return Math.exp(-sum * 2);
}
private var _guesses : Array = [
["5616185650518293",2],
["3847439647293047",1],
["5855462940810587",3],
["9742855507068353",3],
["4296849643607543",3],
["3174248439465858",1],
["4513559094146117",2],
["7890971548908067",3],
["8157356344118483",1],
["2615250744386899",2],
["8690095851526254",3],
["6375711915077050",1],
["6913859173121360",1],
["6442889055042768",2],
["2321386104303845",0],
["2326509471271448",2],
["5251583379644322",2],
["1748270476758276",3],
["4895722652190306",1],
["3041631117224635",3],
["1841236454324589",3],
["2659862637316867",2]
];
private function tr(...o : Array) : void
{
_tf.appendText(o + "\n");
}
}
}