#!/usr/local/bin/perl

use 5.030;

print "Enter numeric secret code: ";
chomp (my $s = <STDIN>);
if ($s !~ /^\d+$/){
    die "Not a chain of digits. Exiting.";
}
my $l = length $s;

my (@sol, $guess);
for my $i (0..9){
    $guess= "$i" x $l;
    $b = bien();
    for (1..$b){
	push @sol, $i;
    }
}

my $count=10;
my $best = join "",@sol;
my $MIN=0;
my $r = $l;
my $b;

while (1) {                      # BUCLE PRINCIPAL
    $guess = trythis();
    $count++;
    print "$count) $guess -> ";
    $b = bien();
    $r = $l - $b;
    say "Bien $b Regular $r"; 
    if ($b>$MIN){
	$MIN=$b;
	$best=$guess;
    }
    last if $b==$l;
}

exit 2;

sub trythis{
    my @g = split "", $best;
    if ($count % 10 == 0){
	return join ("", jlm(@g));
    }else{
#	for (0 .. int ($r/2)){
	    my $r1 = int rand($l);
	    my $r2 = int rand($l);
	    ($g[$r1],$g[$r2]) = ($g[$r2],$g[$r1]); 
#	}
	return join ("",@g);
    }
}

sub bien{
    my $c=0;
    my $g = $guess;
    my $ss = $s;
    for my $i (0..$l-1){
	$c++ if (substr($g,$i,1) eq substr($ss,$i,1));
    }
    return $c;
}

sub jlm {
    # An alternate shuffle
    my @deck = @_;
    my @deck2;
    my $n = scalar(@deck);
    while ($n){
	my $t = int ($n)*rand(); 
	push @deck2, splice(@deck,$t,1);
	$n--;
    }
    return @deck2;
}
   


__END__
