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;