Как стать автором
Обновить

Комментарии 10

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

Единственное добавление к описанному алгоритму – в случае множественных максимумов надо отдавать предпочтение словам из списка допустимых (если таковые среди них есть).

Да, после своего поста я увидел в комментариях интересные мысли. Собственно, самый интересный вопрос: а как вы оцениваете количество получаемой информации? Какая у вас математика?

Кстати, у себя сейчас опытным путём натыкал и подумал, что хорошая тактика первые два-три слова ввести как обычно, а потом играть как в hard mode

Просто по формуле Шеннона: считаю количество слов в каждой "кучке", домножаю на логарифм от него и суммирую. (И всё это со знаком "минус").

(Формула, на самом деле, чуть сложнее, я просто избавился от констант, не оказывающих влияние на сравнения).

Мой вариант решателя на js с поиском по заданному списку существительных на русском:
Wordle Cracker (torrua.github.io)

улучшит ли ситуацию смена тактики с выбора слов, которые режут словарь на максимальное число подсписков, на выбор слов, которые режут на примерно равные подсписки, но в меньшем количестве? Или какой-то промежуточный вариант? Какой вариант статистически выигрышнее?

Статистически выигрышнее вариант, минимизирующий максимальный размер результатов разделения. Т.е. если какое-то слово делит исходное множество на 243 списка, но один из них больше половины множества, это плохое слово для использования на текущем шаге. А если некое слово делит его на 50 списков, но примерно одинаковой длины (или по крайней мере среди них ни один не выделяется вверх так уж сильно — например, 40 списков длиной 110-150, остальные 10 короче) — это хорошее слово, и если не найдется лучшего, стоит использовать его.


А ещё у вас маска для слов в том куске кода, где считаете количество возможных масок, считается неверно: для слова с двумя одинаковыми буквами при наличии одной в загаданном маска для этих букв может быть или GN, или NG, или YY — у вас в вариантах вместо GN будет GY и вместо NG будет YG. Пример: getMask('start','splat') == 'GYYNG' а должна быть GNYNG, показывая, что в загаданном слове одна T, а не две.

Да, мой алгоритм тоже не идеален. Мой пост был скорее ответом на посты с чисто статистическим подходом, я заметил, что можно сделать лучше и почти не думая накатил улучшенную версию, а сейчас у меня пропал запал улучшать это всё (всё равно мы играем в Wordle, потому что нам людям это интересно). На эту тему есть хорошее видео, пожалуй, надо прикрепить его в update поста.

С маской тоже верное замечание. Этот нюанс я заметил значительно позже публикации, когда соответствующий пример попался в игре

Косячную проверку на дубликаты в isThisSecretAvailable можно исправить примерно так:

    dup = set(testword[i] for i in range(len(mask)) if mask[i]=='G' or mask[i]=='Y')
    for i in range(len(mask)):
        if mask[i]=='N' and (testword[i] not in secret or testword[i] in dup):
            continue

Я написал телеграм-бота на основе этого солвера, https://github.com/joric/wordle-solver

Без этого исправления оно например не находит при таких вот масках "но(р)ка глист муз(е)й [д]ожд[ь]" слово "дверь".

а бот запущен? как подключиться?
интересно было-бы использовать.

Своего бота запускал на одной из игр, там было слово "бочина"
Во многих словарях, в том числе в словаре где 50 000 существительных его нет.
В этом словаре оно есть: http://www.opencorpora.org/files/export/dict/
(надеюсь будет полезна ссылка на словарь )

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории