#!perl
use
lib
qw( lib ../lib ../../lib )
;
BEGIN {
use_ok(
'Algorithm::MasterMind::Consistent_Set'
);
}
my
$size
= 128;
my
@alphabet
=
qw( A B C D E F )
;
my
$length
= 4;
my
@strings
;
for
(1..
$size
) {
push
@strings
, random_string( \
@alphabet
,
$length
);
}
my
$c_set
= new Algorithm::MasterMind::Consistent_Set( \
@strings
);
my
@sorted
=
sort
@strings
;
my
@sorted_set
=
sort
$c_set
->consistent_strings;
is(
$sorted_set
[0],
$sorted
[0],
'Set OK'
);
is(
$sorted_set
[
$#sorted_set
],
$sorted
[
$#sorted
],
'Set OK'
);
for
my
$s
(
@strings
) {
ok(
$c_set
->is_in(
$s
),
'Added'
);
}
$c_set
->compute_entropy_score;
my
@top_scorers
=
$c_set
->top_scorers(
'entropy'
);
is(
$top_scorers
[0] ne
''
, 1,
"Computing top scores"
);
$c_set
->compute_most_score;
@top_scorers
=
$c_set
->top_scorers(
'most'
);
my
$one_string
=
splice
(
@top_scorers
,
rand
(
@top_scorers
), 1);
my
$secret
= new Algorithm::MasterMind::Secret
$one_string
;
my
$other_string
=
$top_scorers
[
rand
(
@top_scorers
)];
my
$result
=
$secret
->check(
$other_string
);
$c_set
->cull_inconsistent_with(
$one_string
,
$result
);
if
(@{
$c_set
->{
'_combinations'
}} ) {
my
$rules
= [ {
combination
=>
$one_string
,
blacks
=>
$result
->{
'blacks'
},
whites
=>
$result
->{
'whites'
}} ];
my
$other_c_set
= Algorithm::MasterMind::Consistent_Set->create_consistent_with( \
@strings
,
$rules
);
is_deeply(
$other_c_set
->{
'_combinations'
},
$c_set
->{
'_combinations'
},
'Consistent creation'
);
}
my
$new_random_string
= ( random_string( \
@alphabet
,
$length
) );
$c_set
->add_combination(
$new_random_string
);
ok(
$c_set
->is_in(
$new_random_string
),
'Added'
);
@strings
=
qw(AAAA BBBB CCCC ABCD)
;
$c_set
= new Algorithm::MasterMind::Consistent_Set( \
@strings
);
my
%partitions
= (
'AAAA'
=> {
'0b-0w'
=> 2,
'1b-0w'
=> 1},
'ABCD'
=>{
'1b-0w'
=> 3 },
'BBBB'
=> {
'0b-0w'
=> 2,
'1b-0w'
=> 1 },
'CCCC'
=> {
'0b-0w'
=> 2,
'1b-0w'
=> 1 } );
for
my
$s
(
@strings
) {
is_deeply(
$c_set
->partitions_for(
$s
),
$partitions
{
$s
},
"Partitions for $s"
);
}
$c_set
->compute_most_score;
is(
$c_set
->score_most(
'ABCD'
), 1,
'Scoring OK'
);
is(
$c_set
->score_most(
'AAAA'
), 2,
'Scoring OK'
);
@top_scorers
=
$c_set
->top_scorers(
'most'
);
is_deeply (
scalar
(
@top_scorers
), 3,
'Top scorers'
);
$secret
= new Algorithm::MasterMind::Secret
'ABEE'
;
my
$a_move
=
'DDDD'
;
$result
=
$secret
->check(
$a_move
);
$c_set
->cull_inconsistent_with(
'DDDD'
,
$result
);
is_deeply(
$c_set
->partitions_for(
'AAAA'
), {
'0b-0w'
=> 2 },
"New partitioning"
);