#!/usr/bin/perl

die "usage: $0 <percent change of mutation, '5' for 5%, .01 for 0.01%>\n" unless @ARGV == 1;

my @genes = "A" .. "Z";

my @adam = "A" .. "M";
my @eve  = "N" .. "Z";

print "adam: ", @adam, "\n";
print "eve : ", @eve, "\n\n";

my @generations;

my @oldgen;
my @newgen = (\@adam, \@eve);
my $gen = 0;

while (1)
{
	$gen++;
	@oldgen = @newgen;
	@newgen = ();

	if ($gen % 1000 == 0 || $gen < 50)
	{
		print "generation $gen:\n";
		foreach (@oldgen)
		{
			print "\t", @{$_}, "\n";
		}
		print "\n";
	}


	if ($gen == 1)
	{
		foreach (1 .. 10)
		{
			push @newgen, mate(@oldgen);
		}
	}
	else
	{
		foreach (1 .. 10)
		{
			push @newgen,
				mate(	$oldgen[int(rand(@oldgen))],
					$oldgen[int(rand(@oldgen))],       
				);
		}
	}
}


sub mate
{
	my ($x, $y) = @_;

	my @x = @$x;
	my @y = @$y;
	my @offspring;

	# baby got back
	for (my $i = 0; $i < @x; $i++)
	{
		$offspring[$i] = int(rand(2)) ? $x[$i] : $y[$i];
	}

	# oh shit. it's mutant!
	if (rand(101) <= $ARGV[0]) # chance of mutation
	{
		$offspring[int(rand(@offspring))] = randgene();
	}

	return \@offspring;
}

sub randgene
{
	return $genes[int(rand(@genes))];
}
