http://www.perlmonks.org?node_id=1197335

in reply to Re^6: High Performance Game of Life
in thread High Performance Game of Life

Try this. Notably faster on my machine that is horribly slower than yours.

```package Organism;

use strict;
# use warnings;

sub count {
return scalar keys %{ shift->{Cells} };
}

# Input a list of [ x, y ] coords
sub insert_cells {
my \$cells = shift->{Cells};
for my \$r (@_) { \$cells->{ pack 'i2', @{\$r} } = undef }
}

# Return sorted list of cells in the Organism.
# Used for verification and testing the state of the organism.
sub get_live_cells {
sort { \$a->[0] <=> \$b->[0] || \$a->[1] <=> \$b->[1] }
map { [ unpack 'i2', \$_ ] }
keys %{ shift->{Cells} };
}

sub tick {
my \$self  = shift;
my \$cells = \$self->{Cells};
my ( \$k1, \$k2, \$k3, \$k4, \$k5, \$k6, \$k7, \$k8,
\$x0, \$x1, \$x2, \$y0, \$y1, \$y2, %new_cells, %dead_cells );

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 );
\$dead_cells{\$_}++ for my @zcells = (
(\$k1 = pack 'i2', \$x1, \$y1) x !(exists \$cells->{\$k1}),
(\$k2 = pack 'i2', \$x1, \$y0) x !(exists \$cells->{\$k2}),
(\$k3 = pack 'i2', \$x1, \$y2) x !(exists \$cells->{\$k3}),
(\$k4 = pack 'i2', \$x0, \$y1) x !(exists \$cells->{\$k4}),
(\$k5 = pack 'i2', \$x0, \$y2) x !(exists \$cells->{\$k5}),
(\$k6 = pack 'i2', \$x2, \$y1) x !(exists \$cells->{\$k6}),
(\$k7 = pack 'i2', \$x2, \$y0) x !(exists \$cells->{\$k7}),
(\$k8 = pack 'i2', \$x2, \$y2) x !(exists \$cells->{\$k8}) );

# Check the live cell
# Note: next line equivalent to nlive == 2 || nlive == 3
@zcells == 5 || @zcells == 6 and \$new_cells{\$c} = undef;
}