Perl 3420 ไบต์
ไม่ใช่วิธีแก้ปัญหากอล์ฟ แต่ฉันพบว่าปัญหานี้น่าสนใจ:
#!/usr/bin/perl
use strict;
use warnings;
{
package Farm;
use Data::Dumper;
# models 8 nearest neighbors to position i,j forall i,j
my $neighbors = [ [-1, -1],
[-1, 0],
[-1, +1],
[ 0, -1],
# current pos
[ 0, 1],
[+1, -1],
[+1, 0],
[+1, +1] ];
sub new {
my ($class, %attrs) = @_;
bless \%attrs, $class;
}
sub field {
my $self = shift;
return $self->{field};
}
sub rows {
my $self = shift;
return $self->{rows};
}
sub cols {
my $self = shift;
return $self->{cols};
}
sub adjacents {
my ($self, $i, $j) = @_;
my @adjs;
NEIGHBORS:
for my $neighbor ( @$neighbors ) {
my ($imod, $jmod) = ($neighbor->[0] + $i, $neighbor->[1] + $j);
next NEIGHBORS
if $imod >= $self->rows || $jmod >= $self->cols;
# push neighbors
push @adjs,
$self->field->[$imod]->[$jmod];
}
return @adjs;
}
sub islit {
my ($lamp) = @_;
return defined $lamp && $lamp == 1;
}
sub can_remove_lamp {
my ($self, $i, $j) = @_;
return scalar grep { islit($_) } $self->adjacents($i, $j);
}
sub remove_lamp {
my ($self, $i, $j) = @_;
$self->field->[$i]->[$j] = 0;
}
sub remove_lamps {
my ($self) = @_;
my $removed = 0;
for my $i ( 0 .. @{ $self->field } - 1) {
for my $j ( 0 .. @{ $self->field->[$i] } - 1 ) {
next unless islit( $self->field->[$i]->[$j] );
if( $self->can_remove_lamp($i, $j) ) {
$removed++;
$self->remove_lamp($i, $j);
}
}
}
return $removed;
}
1;
}
{ # Tests
use Data::Dumper;
use Test::Deep;
use Test::More;
{ # 3x3 field
my $farm = Farm->new( rows => 3,
cols => 3,
field => [ [1,0,0],
[0,1,0],
[0,0,1]
]
);
is( 2,
$farm->remove_lamps,
'Removed 2 overlapping correctly'
);
is_deeply( $farm->field,
[ [0,0,0],
[0,0,0],
[0,0,1],
],
'Field after removing lamps matches expected'
);
}
{ # 5x5 field
my $farm = Farm->new( rows => 5,
cols => 5,
field => [ [0,0,0,0,0],
[0,1,0,0,0],
[0,0,1,0,0],
[0,0,0,0,0],
[0,0,0,0,0]
]
);
is( 1,
$farm->remove_lamps,
'Removed 1 overlapping lamp correctly'
);
is_deeply( $farm->field,
[ [0,0,0,0,0],
[0,0,0,0,0],
[0,0,1,0,0],
[0,0,0,0,0],
[0,0,0,0,0],
],
'Field after removing lamps matches expected'
);
}
}
(I / O ถูกนำออกมาเพื่อให้ฉันสามารถแสดงการทดสอบที่เป็นรูปธรรม)