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 )