Algorithm-MasterMind
view release on metacpan or search on metacpan
lib/Algorithm/MasterMind/Secret.pm view on Meta::CPAN
package Algorithm::MasterMind::Secret;
use warnings;
use strict;
use Carp;
# Module implementation here
sub new {
my $class = shift;
my $string = shift || croak "No default string\n";
my $self = { _string => $string,
_chars => [],
_hash => {}};
while ( my $c = chop( $string ) ) {
push @{$self->{'_chars'}}, $c;
$self->{'_hash'}{ $c }++;
}
@{$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
( run in 0.584 second using v1.01-cache-2.11-cpan-39bf76dae61 )