adventofcode/2015/18/1.pl

58 lines
998 B
Perl

use 5.20.0;
use List::AllUtils qw/ min sum /;
my @grid = map { [ split '' ] } map { chomp; $_ } <>;
use DDP;
@grid = iteration(@grid) for 1..100;
say sum map { $_ eq '#' } map { @$_ } @grid;
sub iteration {
my @grid = @_;
#say join ' ', @$_ for @grid;
#say;
my $size = @grid-1;
my @new_grid;
for my $x ( 0..$size ) {
for my $y ( 0..$size ) {
my $neig = neighbors(\@grid,$x,$y);
if( $grid[$x][$y] eq '#' ) {
$new_grid[$x][$y] = $neig ~~ [ 2,3] ? '#' : '.';
}
else {
$new_grid[$x][$y] = $neig == 3 ? '#' : '.';
}
}
}
return @new_grid;
}
sub neighbors {
my( $grid, $x, $y ) = @_;
my $sum;
for my $i ( -1..1 ) {
for my $j ( -1..1 ) {
next if !$i and !$j;
my($m,$n) = ($x+$i,$y+$j);
next if 0 > min $m, $n;
$sum += $grid->[$m][$n] eq '#';
}
}
return $sum;
}