0

如果我什至不能提供我尝试过的东西,我很抱歉,因为我什至不知道从哪里开始。

我有这个很好用的字谜求解器,问题是我希望能够添加允许用户包含的能力?作为通配符进入该领域。

例如,假设用户输入他们的字母 fjsiem?。显然 ? 指任何字母。因此,结果将显示与字段中的字母匹配的单词以及包含任何其他字母的任何其他单词。

我也希望能够在每个包含通配符的单词中指出通配符(字母),这样我就可以更改它的颜色,以便用户知道哪些单词有通配符。

有没有人可以看看我的代码并帮助我?

被调用的单词文件是combined.txt,它只包含每个新行中的单词。

            <?
            if(!empty($_POST['l'])) {
                $time_start = microtime(true);
                $l = $_POST['l'];
                $l = strtolower($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 > 10) return FALSE;

                    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;
                            }
                        }
                    }
                    if(count($w) > 0) return FALSE;
                    return TRUE;
                }


                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 "<p>\n";
                        echo "<b>$c letter words</b><br>";
                    }
                    $wc = $c;
                    echo "$v  &nbsp; ";
                }
            }
            ?>
4

1 回答 1

0

如果你想变得非常懒惰,你总是可以解决 fjsiem?通过 fjsiemz 在 fjsiema 上运行您的工作代码。

如果我正确阅读您的代码,您会找到单词列表,并且只有那些带有 f,然后是 aj,然后是 s,然后是 i,然后是 ae,然后是 m在他们中。因此,剩下的所有 7 个字母长的单词 .{7} 必须符合您的条件。

于 2013-06-02T06:29:16.290 回答