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; }