В среде мобильных устройств существует довольно простая и увлекательная онлайн игра Wordament. Суть игры следующая - дано поле букв 4х4, на котором нужно находить слова , соединяя буквы пальцем. У каждой буквы есть своя стоимость, соответственно, чем больше дорогих букв в слове, тем больше за это слово начисляется очков. На все про все дается 2 минуты.
Так вот, в силу своего скудного ума и медлительности я не мог достичь в этой игре хоть сколько-нибудь значимых результатов. Моя позиция в результирующем списке игроков оказывалась где-то в середине ближе к концу и никак не попадала хотя бы в первую 10-ку. Зависть к лидерам, находившим по 90(!) слов за раунд, нарастала и наконец-то выродилась в подлую мысль о мошенничестве. Ну конечно же, перед тем приступать к созиданию своего собственного орудия отмщения, я полез в интернет, дабы найти что-нибудь готовенькое, но не обнаружил ничего дельного для русской версии игры, кроме статьи на хабре, в которой рассказывалось о реализации решателя на неведомом языке Haskell. Как любой уважающий себя одинесник, в этой статье я ровным счетом ничего не понял, но почерпнул важную табличку с ценой букв.
После болезненных попыток воскресить знания из институтской программы о том, что такое граф и как в нем искать пути, некий алгоритм был создан. В целом решатель имеет вид конфигурации 8.2 с одним регистром сведений и одной обработкой, которая расположена на рабочем столе. В представленной базе данных регистр уже содерджит более 2000000 слов и словоформ. С целью читерства, пользователю нужно ввести все буквы одной строкой в соответствующее поле и нажать интер, после чего на экран будет выведен отчет со всевозможными словами, путь для которых будет выделен посредством цветовой градации от светлого к темному. Первая буква в слове всегда выделена красным. Если в одной клетке содержится две буквы, то эти две буквы следует вводить в верхнем регистре.
На закладке «настройки» можно определить сортировку слов, в которой есть такой параметр, как «Сложность». Под «сложностью» здесь понимается количество изменений направления пути относительно прямолинейного движения. Самым простым считается любое слово, все буквы которого расположены на одной прямой. Так же есть некая сортировка по «номеру группировки по стоимости». При использовании данной сортировки, в соседнем окне требуется указать перечень стоимостей в порядке убывания, по которым будут разбиваться слова. Для примера, если принять стоимость за S и номер группировки за N, то для следующего набора стоимостей 20,10,1 :
S>20 N=1
20>S>10 N=2
10>S>1 N=3
Смысл использования этой сортировки в том, чтобы можно было отсортировать дорогостоящие слова по сложности или по алфавиту.
Помимо сортировки есть возможность указывать цены для букв, и восстанавливать настройки по умлочанию через "Все действия".
Ну а теперь о результатах. Лучшие результаты показала работа в файловом варианте – поиск длится от 2 до 6 секунд (SQL примерно на секунду больше). В итоге мне периодически удавалось попадать на первое место и заработать более 1000 балов за раунд, что потешило мое самолюбие. Но, кончено, читера всегда видно. Если супер-эрудит зарабатывает 1000 балов за 90 слов, то читер зарабатывает те же балы за 30 слов, ибо решатель выдает самые дорогие слова.
О минусах. Частенько решатель выдает и такие слова, о которых wordament знать не знает, при этом уходит впустую время на их ввод. Думаю в словаре wordamenta и близко нет 2000000 слов, но при этом в нем дифференцируются "е" и "ё". Так же время уходит на прокуртку результирующей таблицы. Сейчас мне видится исправление этого недочета выводом таблицы не просто в новое окно табличного документа, а в отдельную форму, где по нажатию на кнопку(интер) будет выводится следующий набор найденных слов.