Комментарии 11
Как я уже комментировал в предыдущей статье, моя реализация алгоритма решателя максимизирует энтропию. Не просто как можно большее число кучек, а как можно большее количество ожидаемой информации.
Единственное добавление к описанному алгоритму – в случае множественных максимумов надо отдавать предпочтение словам из списка допустимых (если таковые среди них есть).
Да, после своего поста я увидел в комментариях интересные мысли. Собственно, самый интересный вопрос: а как вы оцениваете количество получаемой информации? Какая у вас математика?
Кстати, у себя сейчас опытным путём натыкал и подумал, что хорошая тактика первые два-три слова ввести как обычно, а потом играть как в 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/
(надеюсь будет полезна ссылка на словарь )
Ещё одно решение игры Wordle на Python