Algorithm-X-DLX

 view release on metacpan or  search on metacpan

examples/sudoku/Sudoku.pm  view on Meta::CPAN


sub size {
  my ($self) = @_;
  return $self->{type_}->size();
}

sub is_empty {
  my ($self) = @_;
  for my $v (@{$self->{values_}}) {
    return 0 if $v > 0;
  }
  return 1;
}

sub is_valid {
  my ($self) = @_;
  my $n = $self->{type_}->n();
  
  for (my $i = 0; $i < $self->{type_}->size(); ++$i) {
    for(my $j = $i + 1; $j < $self->{type_}->size(); ++$j) {
      my $a = $self->{values_}[$i];
      my $b = $self->{values_}[$j];
      next if $a == 0 || $a != $b;
      # 2 cells have same value, check for same column, row or region
      return 0 if ($i % $n == $j % $n);
      return 0 if (int($i / $n) == int($j / $n));
      return 0 if ($self->{type_}->region($i) == $self->{type_}->region($j));
    }
  }
  return 1;
}

sub is_solved {
  my ($self) = @_;
  return $self->is_valid() && (min(@{$self->{values_}}) > 0);
}

sub get_value {
  my ($self, $pos) = @_;
  return $self->{values_}[$pos];
}

sub set_value {
  my ($self, $pos, $value) = @_;
  $self->{values_}[$pos] = $value;
}

sub equals {
  my ($self, $other) = @_;
  return ($self->{type_} == $other->{type_}) && (array_equals($self->{values_}, $other->{values_}));
}

sub array_equals {
  my ($a1, $a2) = @_;
  # a replacement for the smartmatch operator '~~', giving warnings (experimental) since 5.18
  # optional modules: List::Compare, Array::Compare, Data::Compare
  my $match = @$a1 == @$a2 && !grep { !$_ } map { $a1->[$_] eq $a2->[$_] } 0 .. $#$a1;
  return $match
}

sub not_equals {
  my ($self, $other) = @_;
  return !($self->equals($other));
}

sub to_string {
  my ($self) = @_;
  return $self->to_string_format(SudokuFormat->new($self->{type_}));
}

sub to_string_format {
  my ($self, $format) = @_;
  die "Invalid format" if $format->type() != $self->{type_};
  return $format->to_string(@{$self->{values_}});
}

1;



( run in 1.065 second using v1.01-cache-2.11-cpan-df04353d9ac )