perl tbench1.pl x.tmp 2
####
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 );
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 = (
($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;
# Check the dead cells
for my $z (@zcells) {
( $x0, $y0 ) = unpack 'i2', $z;
( $x1, $x2, $y1, $y2 ) = ( $x0 - 1, $x0 + 1, $y0 - 1, $y0 + 1 );
# Get num live
( ( 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 $new_cells{$z} = undef;
}
}
$self->{Cells} = \%new_cells;
}
sub new {
my $class = shift;
my %init_self = ( Cells => {} );
bless \%init_self, $class;
}
1;
##
##
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;
}
$dead_cells{$_} == 3 and $new_cells{$_} = undef for keys %dead_cells;
$self->{Cells} = \%new_cells;
}
sub new {
my $class = shift;
my %init_self = ( Cells => {} );
bless \%init_self, $class;
}
1;
##
##
This is perl 5, version 24, subversion 0 (v5.24.0) built for MSWin32-x64-multi-thread