Advertisement
Guest User

Untitled

a guest
Aug 16th, 2017
432
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 6.25 KB | None | 0 0
  1. #!/usr/bin/perl -w
  2.  
  3. use strict;
  4. use File::Basename;
  5. use Getopt::Long;
  6. use Date::Format;
  7. use Time::HiRes qw( usleep );
  8. use DBI;
  9.  
  10. # +---------------------------------------------------------------------------+
  11. # !          SUBS DECLARATION                                                 !
  12. # +---------------------------------------------------------------------------+
  13. sub usage(@);
  14. sub findWord(@);
  15. sub findSubWord(@);
  16. sub dbConnect(@);
  17. sub log_message(@);
  18. sub clean_and_exit(@);
  19.  
  20. # +---------------------------------------------------------------------------+
  21. # !          SETTINGS                                                         !
  22. # +---------------------------------------------------------------------------+
  23. select STDOUT;
  24. $| = 1;
  25.  
  26. my $MAIN_PROG_DDBNAME = "scrabble";
  27. my $MAIN_PROG_DBUSER = "mediabot";
  28. my $MAIN_PROG_DBPASS = "*****";
  29. my $MAIN_PROG_DBHOST = "localhost";
  30. my $MAIN_PROG_DBPORT = "3306";
  31.  
  32. my $debug=0;
  33. my $stop_length = 1;
  34. my $max_length = 16;
  35. my $max_result = 20;
  36. my $nbHitCache = 0;
  37. my $nbHitDictionary = 0;
  38. my $nbHitSearchCache = 0;
  39. my $nbSearch = 0;
  40.  
  41. # Check parameters
  42. GetOptions (
  43.         '--debug' => \$debug,
  44.         );
  45.  
  46. unless ( $#ARGV >= 0 ) {
  47.     usage "Invalid argument";
  48. }
  49.  
  50. #print "Length : " . length($ARGV[0]) . "\n";
  51.  
  52. if ( length($ARGV[0]) > $max_length ) {
  53.     usage "Longueur maximum : $max_length";
  54. }
  55.  
  56. my $word = $ARGV[0];
  57. $word =~ tr/a-z/A-Z/;
  58. my @sortedLetters = sort(split(//,$word));
  59.  
  60. my $startedTime = time;
  61. #print "Results Picking : $word Sorted : " . join(" ",@sortedLetters) ." (len=". ($#sortedLetters+1) ." min=$stop_length)\n";
  62. my $sortedParam = join("",@sortedLetters);
  63.  
  64. my %results;
  65. my %wordCache;
  66. my %searchCache;
  67. my $len = length($sortedParam);
  68.  
  69. my $dbh = dbConnect($MAIN_PROG_DDBNAME,$MAIN_PROG_DBHOST,$MAIN_PROG_DBPORT,$MAIN_PROG_DBUSER,$MAIN_PROG_DBPASS);
  70.  
  71. # Look for the whole word
  72. my $foundWord = undef;
  73. if (defined($foundWord = findWord($sortedParam))) {
  74.     $results{$len} = $foundWord;
  75.     if ($debug) { print "Results($len) : $foundWord\n"; }
  76. }
  77. else {
  78.  
  79.     # Search a sub word
  80.     my $current_len = $len -1;
  81.     findSubWord($sortedParam,$current_len);
  82. }
  83.  
  84. # Display results
  85. foreach my $l (sort {$b <=> $a} (keys( %results ))) {
  86.     print "Les mots les plus longs étaient  : " . $results{$l} . " ($l)\n";
  87.     clean_and_exit(undef,0);
  88. }
  89.  
  90. my $duration = time - $startedTime;
  91. #print "Results search completed in $duration secs. (Searches : $nbSearch, Dictionary hits : $nbHitDictionary , Cache hits : $nbHitCache Cache search hits : $nbHitSearchCache)\n";
  92.  
  93. print "Je n'ai pas trouvé de mots\n";
  94. clean_and_exit(undef,0);
  95.  
  96. # +------+
  97. # ! SUBS !
  98. # +------+
  99.  
  100. # Display errors and usage
  101. sub usage(@) {
  102.     my @errMsg = @_;
  103.     if ( $#errMsg >= 0 ) {
  104.         print "Error: " . join (" ",@errMsg) . "\n";
  105.     }
  106.     print "Usage: " . basename($0) . " <letters>\n";
  107.     exit 1;
  108. }
  109.  
  110. # Find sorted word in dictionary
  111. sub findWord(@) {
  112.     my ($sortedWord) = @_;
  113.    
  114.     #Check if word has been previously searched
  115.    
  116.     unless ( defined($wordCache{$sortedWord}) && $wordCache{$sortedWord} ) {
  117.         ## Open dictionary
  118.         $nbHitDictionary++;
  119.         $wordCache{$sortedWord} = 1;
  120.         my $sWordSearchQuery = "SELECT * from DICT where sorted='$sortedWord'";
  121.         my $sth = $dbh->prepare($sWordSearchQuery);
  122.         unless ($sth->execute) {
  123.             log_message("SQL Error : " . $DBI::errstr . " Query : " . $sWordSearchQuery);
  124.         }
  125.         else {
  126.             my $foundWords = undef;
  127.             while (my $ref = $sth->fetchrow_hashref()) {
  128.                 my $realWord = $ref->{'word'};
  129.                 $realWord =~ tr/A-Z/a-z/;
  130.                 #print "Results progress found(" . length($realWord) . "): $realWord  [" . (time - $startedTime)  . " secs]\n";
  131.                 $foundWords .= " $realWord";
  132.             }
  133.             return $foundWords;
  134.         }
  135.     }
  136.     else {
  137.         $nbHitCache++;
  138.         if ($debug) { print "Cache hit for $sortedWord !\n"; }
  139.     }
  140.     return undef;
  141. }
  142.  
  143. # Find sublength words long in $sLetters
  144. sub findSubWord(@) {
  145.     my ($sLetters,$sublength) = @_;
  146.     $wordCache{$sLetters . $sublength} = 1;
  147.     $nbSearch++;
  148.     my $len = length($sLetters);
  149.     my $drop_letters= $len - $sublength;
  150.        
  151.     my $j;
  152.     for ($j=0;$j<$len;$j++) {
  153.     my $sortedWord = "";
  154.     my $leftWord = substr($sLetters,0,$j);
  155.     if (defined($leftWord)) {
  156.         $sortedWord = $leftWord;
  157.     }
  158.     my $rightWord = substr($sLetters,$j+1,$len);
  159.     if (defined($rightWord)) {
  160.       $sortedWord .= $rightWord;
  161.     }
  162.     if ($debug) { print "\t$sortedWord\n"; }
  163.     my $foundWord;
  164.     if (defined($foundWord = findWord($sortedWord))) {
  165.       unless (defined($results{($len-1)})) {
  166.         $results{($len-1)} = $foundWord;
  167.         return 1;
  168.       }
  169.       else {
  170.           $results{($len-1)} .= " $foundWord";
  171.           return 1;
  172.       }
  173.     }
  174.     if ( (length($sortedWord) - 1) >= $stop_length ) {
  175.         unless (defined($wordCache{$sortedWord . (length($sortedWord) - 1)}) && $wordCache{$sortedWord . (length($sortedWord) - 1)}) {
  176.             if (defined($results{length($sortedWord) - 1})) {
  177.                 my @tResults = split(/ /,$results{length($sortedWord) - 1});
  178.                 if ( $#tResults < ($max_result-1) ) {
  179.                     findSubWord($sortedWord,length($sortedWord) - 1);
  180.                 }
  181.             }
  182.             else {
  183.                 findSubWord($sortedWord,length($sortedWord) - 1);
  184.             }
  185.         }
  186.         else {
  187.             if ($debug) { print "Search Cache hit for " . $sortedWord . (length($sortedWord) - 1) . " !\n"; }
  188.             $nbHitSearchCache++;
  189.         }
  190.     }
  191.     }
  192.    
  193.     return 1;
  194. }
  195.  
  196. sub dbConnect(@) {
  197.     my ($dbname,$dbhost,$dbport,$dbuser,$dbpasswd) = @_;
  198.     my $connectionInfo="DBI:mysql:database=$dbname;$dbhost:$dbport";   # Database connection string
  199.     my $dbh;                                                                 # Database handle
  200.  
  201.     if ($debug > 0) { log_message("DEBUG1: Connecting to Database : " . $dbname); }
  202.    
  203.     unless ( $dbh = DBI->connect($connectionInfo,$dbuser,$dbpasswd) ) {
  204.             log_message("DBI Error : " . $DBI::errstr);
  205.             return undef;
  206.     }
  207.     if ($debug > 0) { log_message("DEBUG1: Connected to $dbname."); }
  208.     return $dbh;   
  209. }
  210.  
  211. sub log_message(@) {
  212.     my ($sMsg) = @_;
  213.     my $sDisplayMsg = time2str("[%d/%m/%Y %H:%M:%S]",time) . " $sMsg\n";
  214.     select STDOUT;
  215.     $|=1;
  216.     print $sDisplayMsg;
  217.     #print $sDisplayMsg;
  218. }
  219.  
  220. sub clean_and_exit(@) {
  221.     my ($conn,$iRetValue) = @_;
  222.     #log_message("Cleaning and exiting...");
  223.     if(defined(fileno(LOG))) { close LOG; }
  224.     $dbh->disconnect();
  225.     exit $iRetValue;
  226. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement