Algorithm-MasterMind

 view release on metacpan or  search on metacpan

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

package Algorithm::MasterMind::Test_Solver;

use warnings;
use strict;
use Carp;

use lib qw(../../lib ../../../lib);

our $VERSION =   sprintf "%d.%03d", q$Revision: 1.4 $ =~ /(\d+)\.(\d+)/g; 

use base 'Exporter';
use Algorithm::MasterMind qw(check_combination);

use Test::More;

our @EXPORT_OK = qw( solve_mastermind );

sub solve_mastermind {
  my $solver = shift;
  my $secret_code = shift;
  my $length = length( $secret_code );
  my %played;
  my $first_string = $solver->issue_first;
  $played{$first_string} = 1;
  diag( "This might take a while while it finds the code $secret_code" );
  is( length( $first_string), $length, 'Issued first '. $first_string );
  $solver->feedback( check_combination( $secret_code, $first_string) );
  my $played_string = $solver->issue_next;
  my $played = 2;
  while ( $played_string ne $secret_code ) {
      is( $played{ $played_string}, undef, 'Playing '. $played_string ) ;
      $played{$played_string} = 1;
#      my (%combinations, %fitness);
      # map ( $combinations{$_->{'_str'}}++, @{$solver->{'_pop'}});
      # map ( $fitness{$_->{'_str'}} = $_->Fitness(), @{$solver->{'_pop'}});
      # for my $c ( sort {$combinations{$a} <=> $combinations{$b} } keys %combinations ) {
      # 	print "$c =>  $combinations{$c} $fitness{$c}\n" if $combinations{$c}>1 ;
      # }
      $solver->feedback( check_combination( $secret_code, $played_string) );
      $played_string = $solver->issue_next;
      $played ++;
  }
  is( $played_string, $secret_code, "Found code after ".$solver->evaluated()." combinations" );
  return [$solver->evaluated(), $played];
}

"some blacks, all white"; # Magic true value required at end of module

__END__

=head1 NAME

Algorithm::MasterMind::Test_Solver - Utility functions for testing solvers


=head1 SYNOPSIS

    use Algorithm::MasterMind::Test_Solver;

    my $secret_code = 'EAFC';
    my $population_size = 256;
    my $length = length( $secret_code );
    my @alphabet = qw( A B C D E F );
    my $solver = new Algorithm::MasterMind::Canonical_GA { alphabet => \@alphabet,
							length => length( $secret_code ),
							  pop_size => $population_size};



( run in 0.516 second using v1.01-cache-2.11-cpan-5735350b133 )