Algorithm-MasterMind

 view release on metacpan or  search on metacpan

lib/Algorithm/MasterMind/Secret.pm  view on Meta::CPAN

  }
  @{$self->{'_alphabet'}} = keys %{$self->{'_hash'}};
  bless $self, $class;
  return $self;
}

sub string {
  return shift->{'_string'};
}

sub check {
  my %hash_secret = %{$_[0]->{'_hash'}};
  my %hash_string ;
  my $blacks = 0;
  my $string = $_[1];
  my ($c, $s);
  for my $c (@{$_[0]->{'_chars'}} ) {
    $s = chop( $string );
    if ( $c ne $s ) {
      $hash_string{ $s }++;
    } else {
      $blacks++;
      $hash_secret{ $c }--;      
    }
  }
  my $whites = 0;
  map( exists $hash_string{$_} 
       &&  ( $whites += ($hash_secret{$_} > $hash_string{$_})
	     ?$hash_string{$_}
	     :$hash_secret{$_} ), @{$_[0]->{'_alphabet'}}  );

  return{ blacks => $blacks,
	  whites => $whites } ;
}

sub check_secret  {
  my %hash_secret = %{$_[0]->{'_hash'}};
  my %hash_other_secret =  %{$_[1]->{'_hash'}};
#  my $blacks = 0;
  my $s;
  my $string = $_[1]->{'_string'};
  map(  ($s = chop( $string ) ) 
	&& ( $s eq $_ ) 
	&& (  $_[2]->{'blacks'}++,
	      $hash_secret{ $s }--,
	      $hash_other_secret{ $s }-- ), @{$_[0]->{'_chars'}});

  my $whites = 0;
  map( exists $hash_other_secret{$_} 
       &&  ( $_[2]->{'whites'} += ($hash_secret{$_} > $hash_other_secret{$_})
	     ?$hash_other_secret{$_}
	     :$hash_secret{$_} ), @{$_[0]->{'_alphabet'}}  );
  return;
}
"Can't tell"; # Magic true value required at end of module

__END__

=head1 NAME

Algorithm::MasterMind::Secret - Minimal framework for MM secrets


=head1 SYNOPSIS

    use Algorithm::MasterMind::Secret;

    my $sikrit = new Algorithm::MasterMind::Secret 'ABCD';

    my $blacks_whites = $sikrit->check('BBBB'}

=head1 DESCRIPTION

Basically a string and a hash, caches the string in a hash so that it
is faster to check against it in mastermind. This class is heavily
optimized for speed, which might result in some inconvenients. 

=head1 INTERFACE 

=head2 new ( $string )

A string in an arbitrary alphabet, but should be the same as the ones
you will use to solve

=head2 check( $string )

Checks a combination against the secret code, returning a hashref with
the number of blacks (correct in position) and whites (correct in
color, not position). The string must be a variable. So don't count on the
variable after the call. 

=head2 check_secret( $secret )

Same as above, but the argument must be a L<Algorithm::Mastermind::Secret>. 

=head2 string()

Returns the string corresponding to this secret.

=head1 CONFIGURATION AND ENVIRONMENT

Algorithm::MasterMind requires no configuration files or environment variables.


=head1 DEPENDENCIES

L<Algorithm::Evolutionary>, but only for one of the
strategies. L<Algorithm::Combinatorics>, used to generate combinations
and for exhaustive search strategies. 


=head1 INCOMPATIBILITIES

None reported.

=head1 BUGS AND LIMITATIONS

No bugs have been reported.

Please report any bugs or feature requests to
C<bug-algorithm-mastermind@rt.cpan.org>, or through the web interface at



( run in 2.097 seconds using v1.01-cache-2.11-cpan-df04353d9ac )