my ($a, $c, $g, @b) = (40, 10); $\=$/; for my $r (0..$a) { $b[$r][$_] = ! int(rand($c)) ? '*' : $" for(0..$a) } sub g { my ($d, @e); for my $r (0..$a) { for (0..$a) { my $h=0; for my $i (-1..1) { for my $j (-1..1) { my ($f, $g) = ($r + $i, $_ + $j); next if $f < 0 || $f > $a || $g < 0 || $g > $a || !( $i || $j ); $h++ if $b[$f][$g] ne $" } } $e[$r][$_] = ( $b[$r][$_] ne $" && $h == 2 ) || $h == 3 ? '*' : $"; $d++ if $e[$r][$_] ne $b[$r][$_] } } @b=@e; $d } do{ print`clear`, ++$g; for my $r (0..$a) { print map { $b[$r][$_] } (0..$a) } select $&, $&, $&, .4 } while (&g)