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 )