14 lines
476 B
Raku
14 lines
476 B
Raku
constant target = "METHINKS IT IS LIKE A WEASEL";
|
|
constant mutate_chance = .08;
|
|
constant alphabet = 'A'..'Z',' ';
|
|
constant C = 100;
|
|
|
|
sub mutate { $^string.comb.map({ rand < mutate_chance ?? alphabet.pick !! $_ }).join }
|
|
sub fitness { [+] $^string.comb Zeq target.comb }
|
|
|
|
loop (
|
|
my $parent = alphabet.roll(target.chars).join;
|
|
$parent ne target;
|
|
$parent = max :by(&fitness), mutate($parent) xx C
|
|
) { printf "%6d: '%s' %2d\n", (state $)++, $parent, fitness $parent }
|