#!/usr/bin/perl -w

my $aTrouver=pop @ARGV;

my @avance;
my @mots;
my @joues;

my %original;
my %valeur;
my @inutile;
my $iter=1;

print `date`." - Début\n";
initMots();
print `date`." - Fin chargementt\n";
afficheAvancement();

joueLettre('e');
decalque();

while (afficheAvancement()) {
	my $joueur = decideLettre();
	$iter++;
	print "on joue $joueur\n";
	joueLettre($joueur);
	decalque();
}
print "trouvé en $iter\n";

exit 0;


sub decideLettre {
	my %let;
	my $reg = join "", map {if ($_ eq ".") { "(.)" } else { $_ } } @avance;
	foreach my $mot (@mots) {
		foreach ($mot =~ m/$reg/g) {
			$let{$_}++ unless defined $joues{$_};
		}
	}
	my @classe=(sort { $let{$b}<=>$let{$a} } keys %let); 
	return $classe[0];
}

sub joueLettre {
	my $jeu = pop;
	$joues{$jeu}->{combien}=0;
	while ($aTrouver =~ m/$jeu/g) {
		my $loc = pos $aTrouver;
		$joues{$jeu}->{combien}++;
		push @{$joues{$jeu}->{position}}, $loc;
		$avance[$loc-1] = $jeu;
	}
	push @inutile,$jeu unless ($joues{$jeu}->{combien} > 0);

}

sub decalque {
	my $regexp =join "",@avance;
	$regexp = "^$regexp\$";
	if (@inutile > 0) {
		my $neg = join "|", map { $_} @inutile;
		@mots = grep { /$regexp/ && (! /$neg/) } @mots;
	} else {
		@mots = grep { /$regexp/ } @mots;
	}

}

sub afficheAvancement {
	my $av = 0;
	for ($i=0;$i<length $aTrouver;$i++)  {
		print "$avance[$i]" ;
		$av++ if ($avance[$i] ne ".");
	}
	if (@inutile > 0) {
		my $neg = join ",", map { $_} @inutile;
		print " ($neg)\n";
	}
	print "\n";
	print "$av sur ".(length $aTrouver)."\n";
	return ($av != length $aTrouver);
}

sub initMots {
	@joues =();
	@avance=();
	@inutile=();
	for ($i=0;$i<(length $aTrouver);$i++) {
		$avance[$i] = ".";
	}
	open LISTE,"< liste_fr.txt";
	while (<LISTE>) {
		chop;
		my $old = $_;
		tr/àäáâ/aaaa/;
		tr/èëéê/eeee/;
		tr/ìíïî/iiii/;
		tr/ùúüû/uuuu/;
		tr/òöóô/oooo/;
		tr/[A-Z]/[a-z]/;
		tr/ç/c/;
		my $mot = $_;
		if (length $mot == length $aTrouver) {
			 if (!defined $original{$mot}) {
				  push @mots,$mot;
			 }
			 push @{$original{$mot}},$old;
		}
	}
	close LISTE;
}


