68 lines
1.3 KiB
Perl
68 lines
1.3 KiB
Perl
|
package P1;
|
||
|
|
||
|
use 5.20.0;
|
||
|
use warnings;
|
||
|
|
||
|
use List::AllUtils qw/ /;
|
||
|
|
||
|
use Moose;
|
||
|
|
||
|
use experimental qw/ signatures postderef /;
|
||
|
|
||
|
sub neighbours ( $self, $i, $j, $grid ) {
|
||
|
|
||
|
my $n = 0;
|
||
|
|
||
|
for my $x ( -1, 0, 1 ) {
|
||
|
for my $y ( -1, 0, 1 ) {
|
||
|
next unless $x or $y;
|
||
|
my ( $c, $d ) = ( $i + $x, $j + $y );
|
||
|
next if $c < 0 or $d < 0;
|
||
|
|
||
|
no warnings;
|
||
|
$n += $grid->[$c][$d] eq '#';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $n;
|
||
|
|
||
|
}
|
||
|
|
||
|
sub iterate ( $self, $room ) {
|
||
|
|
||
|
my @grid = map { [ split '' ] } split "\n", $room;
|
||
|
my @next = map { [@$_] } @grid;
|
||
|
|
||
|
for my $i ( 0 .. $#grid ) {
|
||
|
my $row = $grid[$i];
|
||
|
for my $j ( 0 .. $row->$#* ) {
|
||
|
if ( $row->[$j] eq 'L' ) {
|
||
|
if ( not $self->neighbours( $i, $j, \@grid ) ) {
|
||
|
$next[$i][$j] = '#';
|
||
|
}
|
||
|
}
|
||
|
elsif ( $row->[$j] eq '#' ) {
|
||
|
if ( $self->neighbours( $i, $j, \@grid ) >= 4 ) {
|
||
|
$next[$i][$j] = 'L';
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return join "\n", map { join '', @$_ } @next;
|
||
|
}
|
||
|
|
||
|
sub solution ( $self, $room ) {
|
||
|
my $previous;
|
||
|
|
||
|
no warnings;
|
||
|
while ( $room ne $previous ) {
|
||
|
( $previous, $room ) = ( $room, $self->iterate($room) );
|
||
|
}
|
||
|
|
||
|
my @m = $room =~ /(#)/g;
|
||
|
return scalar @m;
|
||
|
}
|
||
|
|
||
|
1;
|