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 )