Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl -w
- use strict;
- use File::Basename;
- use Getopt::Long;
- use Date::Format;
- use Time::HiRes qw( usleep );
- use DBI;
- # +---------------------------------------------------------------------------+
- # ! SUBS DECLARATION !
- # +---------------------------------------------------------------------------+
- sub usage(@);
- sub findWord(@);
- sub findSubWord(@);
- sub dbConnect(@);
- sub log_message(@);
- sub clean_and_exit(@);
- # +---------------------------------------------------------------------------+
- # ! SETTINGS !
- # +---------------------------------------------------------------------------+
- select STDOUT;
- $| = 1;
- my $MAIN_PROG_DDBNAME = "scrabble";
- my $MAIN_PROG_DBUSER = "mediabot";
- my $MAIN_PROG_DBPASS = "*****";
- my $MAIN_PROG_DBHOST = "localhost";
- my $MAIN_PROG_DBPORT = "3306";
- my $debug=0;
- my $stop_length = 1;
- my $max_length = 16;
- my $max_result = 20;
- my $nbHitCache = 0;
- my $nbHitDictionary = 0;
- my $nbHitSearchCache = 0;
- my $nbSearch = 0;
- # Check parameters
- GetOptions (
- '--debug' => \$debug,
- );
- unless ( $#ARGV >= 0 ) {
- usage "Invalid argument";
- }
- #print "Length : " . length($ARGV[0]) . "\n";
- if ( length($ARGV[0]) > $max_length ) {
- usage "Longueur maximum : $max_length";
- }
- my $word = $ARGV[0];
- $word =~ tr/a-z/A-Z/;
- my @sortedLetters = sort(split(//,$word));
- my $startedTime = time;
- #print "Results Picking : $word Sorted : " . join(" ",@sortedLetters) ." (len=". ($#sortedLetters+1) ." min=$stop_length)\n";
- my $sortedParam = join("",@sortedLetters);
- my %results;
- my %wordCache;
- my %searchCache;
- my $len = length($sortedParam);
- my $dbh = dbConnect($MAIN_PROG_DDBNAME,$MAIN_PROG_DBHOST,$MAIN_PROG_DBPORT,$MAIN_PROG_DBUSER,$MAIN_PROG_DBPASS);
- # Look for the whole word
- my $foundWord = undef;
- if (defined($foundWord = findWord($sortedParam))) {
- $results{$len} = $foundWord;
- if ($debug) { print "Results($len) : $foundWord\n"; }
- }
- else {
- # Search a sub word
- my $current_len = $len -1;
- findSubWord($sortedParam,$current_len);
- }
- # Display results
- foreach my $l (sort {$b <=> $a} (keys( %results ))) {
- print "Les mots les plus longs étaient : " . $results{$l} . " ($l)\n";
- clean_and_exit(undef,0);
- }
- my $duration = time - $startedTime;
- #print "Results search completed in $duration secs. (Searches : $nbSearch, Dictionary hits : $nbHitDictionary , Cache hits : $nbHitCache Cache search hits : $nbHitSearchCache)\n";
- print "Je n'ai pas trouvé de mots\n";
- clean_and_exit(undef,0);
- # +------+
- # ! SUBS !
- # +------+
- # Display errors and usage
- sub usage(@) {
- my @errMsg = @_;
- if ( $#errMsg >= 0 ) {
- print "Error: " . join (" ",@errMsg) . "\n";
- }
- print "Usage: " . basename($0) . " <letters>\n";
- exit 1;
- }
- # Find sorted word in dictionary
- sub findWord(@) {
- my ($sortedWord) = @_;
- #Check if word has been previously searched
- unless ( defined($wordCache{$sortedWord}) && $wordCache{$sortedWord} ) {
- ## Open dictionary
- $nbHitDictionary++;
- $wordCache{$sortedWord} = 1;
- my $sWordSearchQuery = "SELECT * from DICT where sorted='$sortedWord'";
- my $sth = $dbh->prepare($sWordSearchQuery);
- unless ($sth->execute) {
- log_message("SQL Error : " . $DBI::errstr . " Query : " . $sWordSearchQuery);
- }
- else {
- my $foundWords = undef;
- while (my $ref = $sth->fetchrow_hashref()) {
- my $realWord = $ref->{'word'};
- $realWord =~ tr/A-Z/a-z/;
- #print "Results progress found(" . length($realWord) . "): $realWord [" . (time - $startedTime) . " secs]\n";
- $foundWords .= " $realWord";
- }
- return $foundWords;
- }
- }
- else {
- $nbHitCache++;
- if ($debug) { print "Cache hit for $sortedWord !\n"; }
- }
- return undef;
- }
- # Find sublength words long in $sLetters
- sub findSubWord(@) {
- my ($sLetters,$sublength) = @_;
- $wordCache{$sLetters . $sublength} = 1;
- $nbSearch++;
- my $len = length($sLetters);
- my $drop_letters= $len - $sublength;
- my $j;
- for ($j=0;$j<$len;$j++) {
- my $sortedWord = "";
- my $leftWord = substr($sLetters,0,$j);
- if (defined($leftWord)) {
- $sortedWord = $leftWord;
- }
- my $rightWord = substr($sLetters,$j+1,$len);
- if (defined($rightWord)) {
- $sortedWord .= $rightWord;
- }
- if ($debug) { print "\t$sortedWord\n"; }
- my $foundWord;
- if (defined($foundWord = findWord($sortedWord))) {
- unless (defined($results{($len-1)})) {
- $results{($len-1)} = $foundWord;
- return 1;
- }
- else {
- $results{($len-1)} .= " $foundWord";
- return 1;
- }
- }
- if ( (length($sortedWord) - 1) >= $stop_length ) {
- unless (defined($wordCache{$sortedWord . (length($sortedWord) - 1)}) && $wordCache{$sortedWord . (length($sortedWord) - 1)}) {
- if (defined($results{length($sortedWord) - 1})) {
- my @tResults = split(/ /,$results{length($sortedWord) - 1});
- if ( $#tResults < ($max_result-1) ) {
- findSubWord($sortedWord,length($sortedWord) - 1);
- }
- }
- else {
- findSubWord($sortedWord,length($sortedWord) - 1);
- }
- }
- else {
- if ($debug) { print "Search Cache hit for " . $sortedWord . (length($sortedWord) - 1) . " !\n"; }
- $nbHitSearchCache++;
- }
- }
- }
- return 1;
- }
- sub dbConnect(@) {
- my ($dbname,$dbhost,$dbport,$dbuser,$dbpasswd) = @_;
- my $connectionInfo="DBI:mysql:database=$dbname;$dbhost:$dbport"; # Database connection string
- my $dbh; # Database handle
- if ($debug > 0) { log_message("DEBUG1: Connecting to Database : " . $dbname); }
- unless ( $dbh = DBI->connect($connectionInfo,$dbuser,$dbpasswd) ) {
- log_message("DBI Error : " . $DBI::errstr);
- return undef;
- }
- if ($debug > 0) { log_message("DEBUG1: Connected to $dbname."); }
- return $dbh;
- }
- sub log_message(@) {
- my ($sMsg) = @_;
- my $sDisplayMsg = time2str("[%d/%m/%Y %H:%M:%S]",time) . " $sMsg\n";
- select STDOUT;
- $|=1;
- print $sDisplayMsg;
- #print $sDisplayMsg;
- }
- sub clean_and_exit(@) {
- my ($conn,$iRetValue) = @_;
- #log_message("Cleaning and exiting...");
- if(defined(fileno(LOG))) { close LOG; }
- $dbh->disconnect();
- exit $iRetValue;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement