METHINKS IT IS A WEASEL
Posted feedbacks - JavaScript
他と同じく、3だと収束しないので5です。 また、ブラウザが固まらないようにsetTimeoutを使っています。Rhinoなどで実行する場合は、setTimerのところをwhileループにでもして下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | function test() {
var x = "METHINKSITISAWEASEL";
var data = sort(initialData(300, x.length), x);
var mutate = 5;
setTimer(x, data, mutate, 0, 100);
}
function setTimer (x, data, mutateNum, count, interval) {
setTimeout(function() {
print(count + " " + data[0] + " " + data[0].differenceFrom(x));
if (data[0].differenceFrom(x) == 0) {
return;
}
data = mutateAndSelect(x, data, mutateNum);
setTimer (x, data, mutateNum, count+1, interval);
}, interval);
}
function mutateAndSelect (x, data, mutateNum) {
var ar = new Array(data.length * mutateNum);
for (var i=0, n=data.length; i<n; i++) {
for (var j=0; j<mutateNum; j++) {
ar[i*mutateNum + j] = data[i].mutate();
}
}
return sort(ar, x).slice(0, data.length);
}
function sort(data, x) {
var cache = {};
data.sort(function (a, b) {
var da = cache[a] || (cache[a] = a.differenceFrom(x));
var db = cache[b] || (cache[b] = b.differenceFrom(x));
return da - db;
});
return data;
}
function initialData(num, len) {
var ar = new Array(num);
for (var i = 0; i<num; i++) {
ar[i] = randomString(len);
}
return ar;
}
function randomString(len) {
var chars = new Array(len);
for (var i = 0; i<len; i++) {
chars[i] = 65 + Math.floor(26*Math.random());
}
return String.fromCharCode.apply(null, chars);
}
String.prototype.differenceFrom = function (str) {
var diff = Math.abs(this.length - str.length);
for ( var i=0, n = Math.min(this.length, str.length); i<n; i++) {
if( this.charAt(i) != str.charAt(i)) diff++;
}
return diff;
}
String.prototype.mutate = function () {
var x = Math.floor(Math.random() * this.length);
return this.substr(0, x) +
String.fromCharCode(65 + Math.floor(26*Math.random()))
+ this.substr(x+1, this.length);
}
var infoArea = document.body.appendChild(document.createElement("div"));
infoArea.innerHTML = " ";
function print(str) {
infoArea.firstChild.nodeValue = str;
}
test();
|


ytakenaka
#6287()
Rating4/8=0.50
ランダムな文字からMETHINKS IT IS A WEASELを作るプログラムを作れ。
簡単に流れを書いてみます。
1:ランダムな20文字を持つ文字列をもった300個作ります。
2:その文字列が"METHINKSITISAWEASEL"に近いものからソートします。
3:それぞれの文字列のなか1文字を別の文字に変化させたものを3つ用意します。
4:それを2:のソートをして上位300個残す。(900個あるうちで上位300個残すということです。)
5:以後3:と4:を繰り返す。
ランダムな文字変化は大文字だけでいいです。簡単にするために空白文字を外してあります。
METHINKS IT IS WEASELができたら終了。3と4の間でソートしたもので一番上位のものを毎回表示させると変化が楽しめます。:-)
Rickard Dawkinsがブラインドウォッチメイカー(現題:盲目の時計職人)の3章で書いていた有名なものです。さらに一般化してもらってもいいです。
参考
[ reply ]