Algorithm-X-DLX
view release on metacpan or search on metacpan
examples/polyomino/Shape.pm view on Meta::CPAN
sub reflect {
my ($self) = @_;
my @rows = map { [reverse @$_] } @{$self->{bits}};
return Shape->new($self->{name}, \@rows);
}
sub rotations {
my ($self) = @_;
my @result = ($self);
my $shape = $self->rotate();
#TODO: compare shapes
while ($shape->not_equals($result[0])) {
push @result, $shape;
$shape = $shape->rotate();
}
return @result;
}
sub reflections {
my ($self) = @_;
my @refl = ($self->reflect());
for my $rot ($self->rotations()) {
#TODO: compare shapes
return ($self) if $rot->equals($refl[0]);
}
return ($self, @refl);
}
sub variations {
my ($self) = @_;
my @vars;
for my $refl ($self->reflections()) {
push @vars, $refl->rotations();
}
return @vars;
}
sub name {
return shift->{name};
}
sub width {
return shift->{width};
}
sub height {
return shift->{height};
}
sub size {
my ($self) = @_;
return $self->{width} * $self->{height};
}
sub get_bit {
my ($self, $yx) = @_;
return $self->{bits}[$yx / $self->{width}][$yx % $self->{width}];
}
use Data::Dumper;
sub equals {
my ($self, $rhs) = @_;
#print Dumper($self->{content}), "\n == ? \n" , Dumper($rhs->{content});
#exit 0;
return $self->{content} eq $rhs->{content};
# return reduce { $a &&= $_ eq $_[2] } (map { $_ eq $_[2] } @{$rhs->{bits}}) == scalar(@{$rhs->{bits}});
}
sub not_equals {
my ($self, $rhs) = @_;
return !($self->equals($rhs));
}
sub less_than {
my ($self, $rhs) = @_;
return join(',', map { join(',', @$_) } @{$self->{bits}}) lt join(',', map { join(',', @$_) } @{$rhs->{bits}});
}
1; # End of package return true;
( run in 0.769 second using v1.01-cache-2.11-cpan-39bf76dae61 )