sub tick { my \$self = shift; my \$cells = \$self->{Cells}; my ( \$k1, \$k2, \$k3, \$k4, \$k5, \$k6, \$k7, \$k8, \$x0, \$x1, \$x2, \$y0, \$y1, \$y2, \$z, %newcells ); for my \$c (keys %{ \$cells }) { # Get the (up to 8) dead cells surrounding the cell ( \$x0, \$y0 ) = unpack 'i2', \$c; ( \$x1, \$x2, \$y1, \$y2 ) = ( \$x0 - 1, \$x0 + 1, \$y0 - 1, \$y0 + 1 ); my @zcells = ( (\$x1, \$y1, \$k1 = pack 'i2', \$x1, \$y1) x !exists(\$cells->{\$k1}), (\$x1, \$y0, \$k2 = pack 'i2', \$x1, \$y0) x !exists(\$cells->{\$k2}), (\$x1, \$y2, \$k3 = pack 'i2', \$x1, \$y2) x !exists(\$cells->{\$k3}), (\$x0, \$y1, \$k4 = pack 'i2', \$x0, \$y1) x !exists(\$cells->{\$k4}), (\$x0, \$y2, \$k5 = pack 'i2', \$x0, \$y2) x !exists(\$cells->{\$k5}), (\$x2, \$y1, \$k6 = pack 'i2', \$x2, \$y1) x !exists(\$cells->{\$k6}), (\$x2, \$y0, \$k7 = pack 'i2', \$x2, \$y0) x !exists(\$cells->{\$k7}), (\$x2, \$y2, \$k8 = pack 'i2', \$x2, \$y2) x !exists(\$cells->{\$k8}) ); # Check the live cell (next line equivalent to nlive==2 || nlive==3) @zcells == 15 || @zcells == 18 and \$newcells{\$c} = undef; # Check the dead cells while (@zcells) { ( \$x0, \$y0, \$z ) = splice @zcells, 0, 3; ( \$x1, \$x2, \$y1, \$y2 ) = ( \$x0 - 1, \$x0 + 1, \$y0 - 1, \$y0 + 1 ); exists(\$cells->{pack 'i2', \$x1, \$y1}) + exists(\$cells->{pack 'i2', \$x1, \$y0}) + exists(\$cells->{pack 'i2', \$x1, \$y2}) + exists(\$cells->{pack 'i2', \$x0, \$y1}) + exists(\$cells->{pack 'i2', \$x0, \$y2}) + exists(\$cells->{pack 'i2', \$x2, \$y1}) + exists(\$cells->{pack 'i2', \$x2, \$y0}) + exists(\$cells->{pack 'i2', \$x2, \$y2}) == 3 and \$newcells{\$z} = undef; } } \$self->{Cells} = \%newcells; }