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

Икона для Тинькофф или как я разбился о чашку

Python *
Ожидает приглашения

Это моя первая публикация. Прошу не судить строго.

С 16 октября и по сей день Тинькофф банк проводит игру 5 букв суть которой в том, что за 6 попыток надо отгадать слово из 5 букв. Если вы попали в букву, но не попали в ее место в слове она белая, если попали и в букву и в ее место, то помечается желтым. Цель все буквы желтые, слово отгадано.

Решил я решение этой игры автоматизировать и написать программу на Pyton которая будет мне подсказывать слова для поиска. И вот какие вопросы понял, что надо решать:

  • Где взять словарь?

  • Как эффективнее всего выводить слова на каждом этапе поиска?

  • С какого слова начинать игру?

  • Как искать?

Где взять словарь

И тут неоценимую помощь я нашел на Открытый корпус русского языка. Этот проект подходит для многого. И мой маленький проект не исключение. Я взял актуальный словарь, а вне оказывается аж 395 тысяч слов и словоформ. Русский язык велик. Но мне нужны только существительные, в единственном числе, в именительном падеже и без всяких там имен, фамилий и отчеств, а также без названий городов. Но данные в проекте представляются с таком хорошем виде, что фильтрацию провел я топорно, то эффективно:

for i in inputfile:
    if v_need_print:
        if len(i.split()[0]) == 5 and \
                i.split()[1].split(sep=',')[0] == 'NOUN' and \
                i.split()[2] == 'sing,nomn' and \
                i.split(',')[-2] != 'Name sing' and \
                i.split(',')[-2] != 'Geox sing' and \
                i.split(',')[-2] != 'Surn sing':
            v_noun.add(i.split()[0])
        v_need_print = False
    if i.strip().isnumeric():
        v_need_print = True

Ура! Моя первая задача решена.

Как выводить слова при поиске и с какого слова начать

В этот момент я вспомнить о ней, о той, что стоит ниже "гнусной лжи" в рейтинге. Я вспомнил про статистику. А статистика, а точнее статистическая информация на Википедии говорит, что буквы в русском языке встречаются с разной частотой Частотность. И вот ориентируясь на данную информацию я решил, что надо сортировать слова по увеличению суммы рангов букв в слове. Возможно тут вы меня поправите и предложите более эффективный подход ведь слово АНИОН (слово с наименьшим рангом по моему рейтингу) наверняка не будет загадано, но для бытового использования подход подошёл. Вопрос решен!

def f_stat_4_word(p_word):
    d_stat = {'О': 1, 'Е': 2, 'А': 3, 'И': 4, 'Н': 5, 'Т': 6, 'С': 7, 'Р': 8, 'В': 9, 'Л': 10, 'К': 11, 'М': 12,
              'Д': 13,
              'П': 14, 'У': 15, 'Я': 16, 'Ы': 17, 'Ь': 18, 'Г': 19, 'З': 20, 'Б': 21, 'Ч': 22, 'Й': 23, 'Х': 24,
              'Ж': 25, 'Ш': 26, 'Ю': 27, 'Ц': 28, 'Щ': 29, 'Э': 30, 'Ф': 31, 'Ъ': 32, 'Ё': 33, '-': 34}
    v_stat = 0
    for i in p_word:
        v_stat += d_stat[i]
    return v_stat

Для определения того с какого слова начать я решил пойти таким путем: надо найти слово с наибольшим числом высоковероятных (низкорейтинговых) букв. И методом легкого подбора я нашел ее ИКОНА. Не думая раньше об этом я увидел, что в нем самые топовые буквы. Это просто восторг. Вопрос решен!

Начнем искать!

Разделим и эту задачу на части. Я решил взять весь исходный массив слов и выкидывать из них те, что не подходят по критерию поиска. И вот какие функции я решил создать:

  • Выбрать слова в которых гарантированно есть заданные буквы;

  • Выбрать слова в которых точно нет заданных букв;

  • Выбрать слова в которых заданные буквы стоят на четко указанных местах;

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

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

И все у меня пошло так хорошо. Ну почти. На этапе отладки я столкнулся с задачей наличия одной буквы более одного раза в слове и пришлось решать этот вопрос. Но я прошел и это испытание. Призы валились как из рога изобилия. Пока организаторы нечаянно или специально не выставили мощную преграду. И имя этой преграды - ЧАШКА. Оказывается в русском языке 76 слов со структурой ?А?КА:

НАНКА
ТАТКА
РАНКА
ТАСКА
ЛАНКА
ВАТКА
ЛАТКА
САВКА
САЛКА
МАНКА
ЛАСКА
ВАРКА
КАСКА
МАТКА
ЛАВКА
САМКА
ВАЛКА
МАСКА
РАМКА
САДКА
МАРКА
НАУКА
ТАПКА
САПКА
ПАРКА
МАЛКА
ДАВКА
КАМКА
ЗАИКА
ЛАПКА
КАДКА
МАМКА
ГАНКА
ПАЛКА
ДАМКА
БАНКА
ТАЧКА
БАСКА
ПАПКА
БАРКА
ТАЙКА
ГАЛКА
ХАТКА
ЧАРКА
САЙКА
БАЛКА
ЖАТКА
ТАШКА
ЧАЛКА
МАЗКА
ЖАРКА
ЛАЙКА
КАЧКА
МАЙКА
ДАЧКА
ЧАДКА
ШАВКА
ДАЙКА
ПАЧКА
ХАМКА
КАШКА
ПАЙКА
ЖАМКА
ФАСКА
ШАПКА
ГАЙКА
ЦАПКА
БАБКА
ЗАЙКА
БАЙКА
ЧАЙКА
ЖАБКА
БАШКА
ЧАШКА
ШАЙКА
ШАШКА
ЦАЦКА

При том, что ЧАШКА в моем рейтинге стоит очень низко, а попыток 6, да и к указанной структуре слова я пришел наверно на третьем ходе, то моя схема "подорвалась" на этой мине. После 43 безошибочно угаданных слов я проиграл. Но зато узнал много интересного. И мой процент удачно найденных слов более 85%. И дальше я пошел не менее решительно. И все 60 слов я отгадал, и все призы получил, и использовал многие.

Итог

Игра продолжается. Хоть призов уже/пока нет, но это не мешает мне использовать мой код для поиска слов.

Желаю и вам вот так автоматизировать простые вещи. Получать от этого выгоду и переходить все выше в своих кодовых достижениях.

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.