2009-10-16 2 views
4

Я создал это приложение пару месяцев назад: http://www.mondofacto.com/word-tools/scrabble-solver.htmlКак мне искать «чистую черепицу» в приложении для царапин? (PHP)

Приложение позволяет пользователю вводить набор букв они приведены, и отсылает обратно то, что действительными слова, которые они могут использовать, наряду с тем, что оценка они будут получите за использование этих писем.

В принципе, я хочу расширить приложение, чтобы пользователи могли вводить «пустую черепицу» - это тот, который может быть квалифицирован как любая из 26 букв алфавита и повторять слова, которые являются действительными.

Ниже приведен скриншот структуры базы данных.

http://i37.tinypic.com/28v6a8h.png 

Возможно, вам потребуется скопировать этот^в ваш браузер.

Прогон запрос на этих данных, когда пользователь вводит, например, «муравьед» - выглядит следующим образом:

SELECT * FROM scrabble WHERE a <= 3 AND b <= 0 AND c <= 0 AND d <= 1 AND e <= 0 AND f <= 0 AND g <= 0 AND h <= 0 AND i <= 0 AND j <= 0 AND k <= 1 AND l <= 0 AND m <= 0 AND n <= 0 AND o <= 0 AND p <= 0 AND q <= 0 AND r <= 2 AND s <= 0 AND t <= 0 AND u <= 0 AND v <= 1 AND w <= 0 AND x <= 0 AND y <= 0 AND z <= 0 AND length <= 8 ORDER BY scrabble DESC 

Если вы хотите, чтобы увидеть результаты введите слово в ссылке, которую я разместил на Вверх.

Право,

Так ли кто-нибудь есть идеи, как приблизиться к делать это? Я начал со следующего кода, который добавляет каждый символ алфавита в конец строки, введенной пользователем, если они помещают пробелы (пробелы являются пустой плиткой).

if (preg_match('/[\s]/', $string)) { 

    $wild_string = $string; 

    foreach (range('a','z') as $i) { 

     $wild_string = $string; 
     $wild_string .= $i; 

     } 

Переменная $ wild_string - это та, которую каждая буква добавляется к циклу. Сбрасывая его в исходную строку в каждом цикле, он останавливает код от добавления всех 26 букв в введенную строку.

Я надеюсь, что кто-то может помочь, и жаль, если я колебалась :)

Энди.

+0

Интересно, что думает, что я могу сделать «ID» из «zzzi», но не из «zzi» – Greg

+0

вот ошибка, мне нужно исправить - спасибо за указание на это. – Andy

+0

исправил это сейчас. Любая идея для пустой плитки вещь :)? – Andy

ответ

0

Единственный метод, который я могу придумать, - это запустить ваш запрос выше 26 раз, каждый раз добавляя 1 к другой букве алфавита, а также 1 к пределу длины, а затем удаляя дубликаты.

1

Мое предложение заключается в следующем:

Допустим, пользовательский ввод: ab* где * является групповой символ. Граф все известные буквы и символы и создать массив, в котором элемент 0 является число групповых символов и любой другой ключевой элемент является известное письмо со значением, сколько раз она во входных данных пользователя:

function GetArrayLetters($userInput) { 
    ... 
    // produces something like $letters = (0 => 1, 'a' => 1, 'b' => 1); 
    return $letters; 
} 

с помощью этого массива изменить запрос, добавив количество подстановочных знаков в каждой букве и по длине этого слова:

# with only one wildcard, the query will become: 
SELECT * FROM scrabble WHERE a <= 2 AND b <= 2 AND c <= 1 .... 
    ... AND length <= 3 

Теперь поместите результаты где-то (массив) и проверьте каждое слово, в свою очередь. Пройдите через каждую букву и вычтите ее для каждой известной буквы из вашего массива букв $; Если значение известной буквы равно нулю, вычтите из элемента 0 вместо (подстановочный знак).Если вы получите отрицательное значение для подстановки, а затем отбросить слово:

foreach ($result_set AS $word) { 
    $letters = GetArrayLetters($userInput); 
    for ($i = 0; $i < str_len($word); $i++) { 
    $letter = substr($word, $i, 1); 
    if (array_key_exists($letter, $letters)) { 
     if ($letters[$letter]) > 0 { 
     $letters[$letter] -= 1; 
     } else { 
     $letters[0] -= 1; // else subtract from the wildcard 
     } 
    } else { 
     $letters[0] -= 1; 
    } 

    if ($letters[0] < 0) { 
     // if wildcard falls bellow zero, discard the word 
    } 
    } 
} 
0

Я хотел бы использовать звездочку, чтобы отметить пустую плитку и сделать следующее, если вход был DOR *:

SELECT * FROM scrabble WHERE d + o + r + $number_of_wildcards >= length 

Если я правильно понял вашу структуру базы данных, это должно было вернуться к двери, общежитию, дурку, запаху и т. Д.

EDIT: Эта версия также должна соответствовать более коротким словам, например, do, rod и т. Д.

+0

Это также даст вам «комнату» (d = 0, o = 2, r = 1 и length = 4) –

+0

Вы абсолютно правы. Может быть, это может быть использовано для сужения поиска, а затем итерации с помощью PHP? – Kaivosukeltaja

1

Благодарим за то, что я вдохновил меня на создание собственного Слова.
http://www.wireless-trend.com/wordfinder_index_eng.php

Для поиска пустых плиток, что я сделал: Подсчитайте количество заготовок, необходимых, чтобы сделать слово в базе данных. Ограничьте это в запросе количеством пробелов, введенных пользователем.

Вы можете использовать неограниченное количество пробелов.

"length" - длина каждого слова в моей базе данных.
"a" - номер слова в слове в моей базе данных.
$word_a - номер слова в слове, введенном пользователем.
$number_of_blanks - это номер? В слове, введенном пользователем.

SELECT * FROM $table WHERE length <= $length_of_word_searched_by_user 
AND 
(
    (greatest(a,$word_a)-$word_a)+ 
    (greatest(b,$word_b)-$word_b)+ 
    (greatest(c,$word_c)-$word_c)+ 
    ..<br> 
    ..<br> 
    (greatest(y,$word_y)-$word_y)+ 
    (greatest(z,$word_z)-$word_z) 
) <= $number_of_blanks 
Смежные вопросы