Я решил написать пост о проекте, который я создал за несколько месяцев до того, как стал iOS-разработчиком. Как вы можете видеть из названия, я сделал приложение, чтобы помочь вам — по сути, обмануть — в популярной игре Wordle. Это было очень интересное приложение для написания с множеством проблем и кривых обучения.

На этом изображении показано, как мое приложение (слева) можно использовать вместе с Wordle (справа). Во время игры после каждого предположения вы можете ввести слово, которое вы отправили в приложение, и отразить результаты цвета. Нажмите «Отправить», и он вернет список всех оставшихся возможных слов.

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

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

Перед созданием этого приложения, которое помогло бы вам найти правильное слово, я создал приложение, которое могло бы проверять конкретное начальное слово и прогонять его по всем возможным ответам и видеть в среднем, сколько догадок потребовалось, чтобы получить ответ. Я хотел сделать это, чтобы у меня было приблизительное представление о том, какое начальное слово будет лучшим, то есть получить ответ за наименьшее количество попыток. Приступая к этой задаче, я в первую очередь должен был сделать реплику игры Wordle, которую я мог бы использовать для своего тестирования. Я построил его с помощью простого Swift, что не заняло много времени. Мне пришлось найти список всех пятибуквенных слов и сохранить их в огромный массив в моем проекте. Было около 5000 возможных слов. Чтобы игра шла сама по себе, я создал цикл, в котором перебираю все возможные начальные слова и все возможные ответы. После каждого предположения он будет фильтровать список до единственно возможных предположений и повторять до тех пор, пока он не угадает правильно.

На этих изображениях выше я ввел свое начальное слово в верхнем текстовом поле «ЯЩИК». Моя программа автовоспроизведения использовала это в качестве своего первого предположения и вернула только зеленую плитку на букве «А», а все остальное — серое. На втором изображении используется слово, которое находится в оставшемся списке после фильтрации по критериям из первого предположения и ответа. Он выбирает слово «СНОВА», что мало чем помогает, кроме исключения некоторых общих букв, таких как «I», «G» и «N». На третьем изображении он угадывает «FLAKY», что очень помогает, поскольку первые три буквы подсвечиваются зеленым. Следующая догадка верна, но моя программа не показывает ответ и сразу переходит к следующему вращению, чтобы сделать его более эффективным.

Это изображение является результатом работы моей программы автовоспроизведения в течение примерно 10–15 секунд. Как вы можете видеть, появились некоторые статистические данные, в первую очередь гистограмма в нижней части экрана. Это представление того, сколько догадок потребовалось для получения каждого ответа. Самая верхняя полоса соответствует 4 предположениям, а ось X увеличивается/уменьшается на 1. Эта диаграмма меняется в ходе работы программы. Десятичное число в левом верхнем углу экрана — это среднее количество догадок до получения ответа, а целое число в правом верхнем углу — это количество поворотов, т. е. сколько различных ответов было проверено для этого начального слова.

Я запустил этот процесс для слов с большим количеством общих букв, таких как «КРАН», «СТАВКИ», «ШИФЕР» и «ЯЩИК». Проведя много тестов, я не смог найти слово, которое дало бы лучший результат, чем «ЯЩИК», что заставило меня поверить, что это лучшее начальное слово, которое, скорее всего, даст вам ответ с наименьшими попытками. Он дал средний балл 3,98.

Это побудило меня использовать слово «ЯЩИК» в качестве начального слова во всех попытках Wordle при использовании моего помощника Wordle.

На этих изображениях показано, как мое приложение на практике угадывает ответ с двух попыток, используя начальное слово «ЯЩИК». После первого предположения последние 3 буквы оказываются на правильном месте. Это отфильтровало список до нескольких возможных слов. Мой алгоритм, созданный для сортировки списка перед возвратом, посчитал, что слово «SLATE» будет следующим лучшим предположением. Очевидно, это было правильно. Не каждый раз он будет получать ответ с наименьшими попытками, как эта. Этот ответ был получен очень быстро, так как слово «SLATE» содержит большое количество очень распространенных букв. Слова с некоторыми необычными буквами, такими как «ТЮЛЬПАН», могут потребовать нескольких дополнительных догадок.

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

Спасибо, что проявили интерес к чтению моего блога. Мне очень понравилось работать над созданием этого полезного приложения, и его очень весело использовать, когда вы боретесь с ежедневным Wordle.