反转字谜求解器以首先显示最长的单词

Posted

技术标签:

【中文标题】反转字谜求解器以首先显示最长的单词【英文标题】:reversing anagram solver to display the longest words first 【发布时间】:2013-05-03 13:44:21 【问题描述】:

我的一个网站上有一个字谜求解器,它可以在 txt 文件中搜索单词并返回结果。它将首先返回 2 个字母单词的结果,然后向下滚动至 12 个字母单词。我喜欢使用文本文件作为我的数据库,因为它返回结果的速度非常快。

我想颠倒结果的顺序,以便它首先显示 12 个字母的单词,然后向下滚动到 2 个字母的单词。这是我的代码,我将解释到目前为止我所做的哪些更改会产生错误而不是我想要的结果。我很难理解它。

我会列出我的代码以及下载 txt 文件的链接,如果你需要的话,这是一个单词列表。

链接到文本文件http://guildfit.com/combined.txt

<?
//Code Here//
$l = 'apple';
if(!empty($l))  ?>
<table cellpadding="5" cellspacing="0" border="0"  style="text-align:left">
<tr>
    <td style="text-align:center; font-weight:bold; width:100%" colspan="20">Click on words to get definitions</td>
</tr>
<?
$time_start = microtime(true);
$l = $l;
$l = trim($l);
$l = strtolower($l);
$l = str_replace(' ', '_', $l); 
$l = preg_replace('/[^\w]/', '', $l);
$len = strlen($l);

$a = array('a' => 1, 'b' => 1, 'c' => 1, 'd' => 1, 'e' => 1, 'f' => 1, 'g' => 1, 'h' => 1, 'i' => 1, 'j' => 1, 'k' => 1, 'l' => 1, 'm' => 1, 'n' => 1, 'o' => 1, 'p' => 1, 'q' => 1, 'r' => 1, 's' => 1, 't' => 1, 'u' => 1, 'v' => 1, 'w' => 1, 'x' => 1, 'y' => 1, 'z' => 1);

function contains($word) 
    $wlen = strlen($word);
    if($wlen < 2 || $wlen > 12) return FALSE;

    //for($i = $wlen; $i > 1; $i--) 
    for($i = 0; $i < $wlen; $i++) 
        $w[$i] = $word[$i];
    

    $b = $GLOBALS['b'];
    foreach($b as $n => $c) 
        foreach($w as $k => $v) 
            if($v == $c) 
                unset($w[$k]);
                unset($b[$n]);
                break;
            
        
    
    //echo "count: ". count($w) ."\n";
    if(count($w) > 0) return FALSE;
    return TRUE;



//for($i = $wlen; $i > 1; $i--) 
for($i = 0; $i < $len; $i++) 
    $b[$i] = $l[$i];
    unset($a[$l[$i]]);


$e = 'cat combined.txt';

while(list($k) = each($a)) 
    if(!$e) 
        $e = "grep -v $k combined.txt";
     else 
        $e .= ' | grep -v '. $k;
    


exec($e, $o);

settype($w, 'array');
foreach($o as $v) 
    if(contains($v)) 
        $w[] = $v;
    


function mycmp($a, $b) 
    $ca = strlen($a);
    $cb = strlen($b);
    if($ca == $cb) return 0;
    if($ca > $cb) return 1;
    return -1;

usort($w, 'mycmp');
$wc = 0; 
foreach($w as $v) 
    $c = strlen($v);
    if($wc != $c) 
        echo '';
        echo "<tr><td style='color:#FF0000'><h2>Words anagram from <em>$l</em></h2></td><td style='color:#FF0000'><h2 style='text-align:center'>Scrabble Points</h2></td><td style='color:#FF0000'><h2 style='text-align:center'>Words With Friends Points</h2></td></tr>";
        echo "<tr><td colspan=2><h2>$c letter words</h2></td></tr>";    
    
    $wc = $c;
    $getvalues = str_split($v);
    $thisletter1 == 0;
    $thisletter1wwf == 0;
    // Scrabble Points
    foreach($getvalues as $letter) 
        if ($letter == 'a' || $letter == 'e' || $letter == 'i' || $letter == 'l' || $letter == 'n' || $letter == 'o' || $letter == 'r' || $letter == 's' || $letter == 't' || $letter == 'u') 
            $thisletter = 1;
         elseif ($letter == 'd' || $letter == 'g') 
            $thisletter = 2;
         elseif ($letter == 'b' || $letter == 'c' || $letter == 'm' || $letter == 'p') 
            $thisletter = 3;
         elseif ($letter == 'f' || $letter == 'h' || $letter == 'v' || $letter == 'w' || $letter == 'y') 
            $thisletter = 4;
         elseif ($letter == 'k') 
            $thisletter = 5;
         elseif ($letter == 'j' || $letter == 'x') 
            $thisletter = 8;
         elseif ($letter == 'q' || $letter == 'z') 
            $thisletter = 10;
        
        $thisletter1 = $thisletter1+$thisletter;
    
    // WWF Points
    foreach($getvalues as $letterwwf) 
        if ($letterwwf == 'a' || $letterwwf == 'e' || $letterwwf == 'i' || $letterwwf == 'o' || $letterwwf == 'r' || $letterwwf == 's' || $letterwwf == 't') 
            $thisletterwwf = 1;
         elseif ($letterwwf == 'd' || $letterwwf == 'l' || $letterwwf == 'n' || $letterwwf == 'u') 
            $thisletterwwf = 2;
         elseif ($letterwwf == 'g' || $letterwwf == 'h' || $letterwwf == 'y') 
            $thisletterwwf = 3;
         elseif ($letterwwf == 'b' || $letterwwf == 'c' || $letterwwf == 'f' || $letterwwf == 'm' || $letterwwf == 'p' || $letterwwf == 'w') 
            $thisletterwwf = 4;
         elseif ($letterwwf == 'k' || $letterwwf == 'v') 
            $thisletterwwf = 5;
         elseif ($letterwwf == 'x') 
            $thisletterwwf = 8;
         elseif ($letterwwf == 'j' || $letterwwf == 'q' || $letterwwf == 'z') 
            $thisletterwwf = 10;
        
        $thisletter1wwf = $thisletter1wwf+$thisletterwwf;
    

    echo "";
    echo '';
    $thisletter1 = 0;
    $thisletter1wwf = 0;

$time_end = microtime(true);
$time = round($time_end - $time_start, 5);
echo "<tr><td style='text-align:center' colspan='20'>Found <strong>". count($w) ."</strong> words in <strong>$time</strong> seconds</td></tr></table>";

// End Code Here//
?>

我尝试过的只是尝试反转“for”循环,这是当前有效的循环。请注意,循环存在 2 个位置。

当前“for”循环运行良好,但显示 2 - 12 的结果

for($i = 0; $i < $wlen; $i++) 

我尝试将其更改为这个以尝试将顺序从 12 - 2 颠倒

for($i = $wlen; $i > 1; $i--) 

如果您注意到这里 $wlen 被声明为字符串长度,$word 是某人从表单字段中输入的单词。

$wlen = strlen($word);

当我更改“for”循环时,我在第 29 行得到一个错误,即

foreach($b as $n => $c)  

我对这个错误感到困惑,因为在此之前的任何地方都没有声明 $c,但是如果你使用第一个“for”循环而不是第二个,脚本可以正常工作。

有什么想法吗?

【问题讨论】:

如果您的变量名称更具描述性会有所帮助。 $v, $o, $a, $b... 这些对于任何阅读你代码的人来说都是毫无意义的。 (一年后,你会忘记为什么给它们起这个名字,它们对你来说也毫无意义。) 另外,您能否像现在一样生成,将它们全部存储在一个数组中,然后只需 array_reverse($results)` 吗? 【参考方案1】:

如果您更改用于排序$w(字谜数组)的比较函数,则您的排序应该颠倒。

function mycmp($a, $b) 
    $ca = strlen($a);
    $cb = strlen($b);
    if($ca == $cb) return 0;
    if($ca > $cb) return 1;
    return -1;

改成

function mycmp($a, $b) 
    $ca = strlen($a);
    $cb = strlen($b);
    if($ca == $cb) return 0;
    if($ca > $cb) return -1;
    return 1;

看看会发生什么。

【讨论】:

【参考方案2】:

按照 Patashu 的回答,比较功能可能会更简单(并且更容易看到反转时发生的情况):

// Smallest to largest:
function stringLengthCompare($a, $b) 
    return strlen($a) - strlen($b)


// Largest to smallest:
function stringLengthCompare($a, $b) 
    return strlen($b) - strlen($a)

【讨论】:

以上是关于反转字谜求解器以首先显示最长的单词的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 字谜求解器 [关闭]

查找最长字谜的算法

php - 向字谜求解器添加通配符

编写一个程序求解字谜游戏问题

对字谜求解器实施空白平铺搜索的最佳实践

获取所有子串(拼字游戏)的字谜的所有单词列表的算法?