80 lines
1.1 KiB
Plaintext
80 lines
1.1 KiB
Plaintext
integer
|
|
fitness(data t, data b)
|
|
{
|
|
integer f, i;
|
|
|
|
f = 0;
|
|
|
|
i = b_length(t);
|
|
while (i) {
|
|
i -= 1;
|
|
f += sign(t[i] ^ b[i]);
|
|
}
|
|
|
|
return f;
|
|
}
|
|
|
|
void
|
|
mutate(data c, data b, data u)
|
|
{
|
|
integer i, l;
|
|
|
|
l = b_length(b);
|
|
i = 0;
|
|
while (i < l) {
|
|
if (drand(15)) {
|
|
b_append(c, b[i]);
|
|
} else {
|
|
b_append(c, u[drand(26)]);
|
|
}
|
|
i += 1;
|
|
}
|
|
}
|
|
|
|
integer
|
|
main(void)
|
|
{
|
|
data b, t, u;
|
|
integer f, i, l;
|
|
|
|
b_cast(t, "METHINK IT IS LIKE A WEASEL");
|
|
b_cast(u, "ABCDEFGHIJKLMNOPQRSTUVWXYZ ");
|
|
|
|
l = b_length(t);
|
|
|
|
i = l;
|
|
while (i) {
|
|
i -= 1;
|
|
b_append(b, u[drand(26)]);
|
|
}
|
|
|
|
f = fitness(t, b);
|
|
while (f) {
|
|
data n;
|
|
integer a;
|
|
|
|
o_form("/lw4/~\n", f, b_string(b));
|
|
|
|
n = b;
|
|
|
|
i = 32;
|
|
while (i) {
|
|
data c;
|
|
|
|
i -= 1;
|
|
mutate(c, b, u);
|
|
a = fitness(t, c);
|
|
if (a < f) {
|
|
f = a;
|
|
n = c;
|
|
}
|
|
}
|
|
|
|
b = n;
|
|
}
|
|
|
|
o_form("/lw4/~\n", f, b_string(b));
|
|
|
|
return 0;
|
|
}
|