«Словохват»

Вчера подсел на игру «Словохват», вроде игра незамысловатая, но очень интересная. Словохват (85.68КиБ) Смысл — занять одну из клеток противника, помеченного «звёздочкой», в терминах игры это называется «столица». Чтобы занять клетку, нужно придумать слово с буквой, которая написана на этой клетке, причём нужно уложиться в отведённое время — сверху тикает таймер.

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

На медиане поля действуют ещё какие-то законы, пока не разбирался, правила есть на сайте. Длина слов важна — упрощённо, чем длинее слово, тем больше вам даётся очков, за очки можно «покупать» различные штуки — дополнительное время, дополнительную букву, «молнию» (вычищает близкорасположенную клетку от цвета противника).

У автора получилась неплохая такая тактическая игра. Мне играть было скучновато — очень лень выдумывать слова, поэтому я написал небольшую программу на Пайтоне, которая работает со словарём под редакцией профессора Лопатина, ей нужно задать файл словаря и буквы, которые у вас есть, она придумает слово: Словохватохват (18.24КиБ) Работает неспешно, я оптимизировать не стал, времени, даваемого игрой, на поиск вполне хватает (по крайней мере на моём ноуте). Если кому-то захочется оптимизации, то просто посмотрите как преобразуется словарь и закешируйте преобразованный вариант.

У меня на каждом запуске словарь преобразуется заново. Естественно, в словаре, помимо разрешённых частей речи, есть прилагательные, глаголы и так далее — их я не отфильтровываю, в словаре нет для этого информации.
# coding: utf-8
import itertools
import sys
import codecs

# дружим с консолью
sys.stdin = codecs.getreader('utf-8')(sys.stdin)
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)

# строки с пропусками любых букв в любом количестве
def combinations(str):
    for l in xrange(2, len(str)+1):
        yield itertools.combinations(str, l)

# собираем каждую в строку
def iterstr(str):
    for s in itertools.chain(*combinations(str)):
        yield u''.join(s)

# все наши комбинации
def uniqcombinations(str):
    return set(iterstr(sorted(str)))

# проходим по словарю
def iterdict(name, min, max):
    with open(name, 'r') as f:
        for line in f:
            line = line.strip().decode('cp1251')

            # текущее слово должно содержать только буквы и быть не больше искомого слова
            if max >= len(line) >= min and line.isalpha():
                yield u''.join(sorted(line)), line

# ищем наше слово
def find(word, dictname):
    words = uniqcombinations(word)

    for line, original in iterdict(dictname, 3, len(word)):
        if line in words: print(original)

# запуск программы и небольшая помощь
try:
    find(sys.argv[2].decode('utf-8'), sys.argv[1].decode('utf-8'))
except IndexError:
    print(u'Запуск: {0} <словарь> <буквы в наличии>'.format(sys.argv[0]))
Писал именно на Пайтоне из-за прекрасного модуля itertools, на этот раз он пригодился функцией combinations — она выдаёт генератор всех комбинаций букв, заданной длины, без изменения их порядка. Очень хорошо, что не пришлось писать этот скучный кусок кода самостоятельно.

Если вы думаете, что выиграть можно бездумно подставляя слова из моей программы, то сильно ошибаетесь — на сайте попадаются противники, которые вас с таким подходом разнесут в пух и прах.
4 декабря 2013 08:24

Бабаев Александр (bealex.moikrug.ru)
4 декабря 2013, 09:20

Letterpress (http://www.atebits.com/letterpress/) наше все :-)

Евгений Степанищев (bolknote.ru)
4 декабря 2013, 09:25, ответ предназначен Бабаев Александр (bealex.moikrug.ru):

На инглише что ли? :)

Бабаев Александр (bealex.moikrug.ru)
4 декабря 2013, 09:29, ответ предназначен Евгений Степанищев (bolknote.ru):

Угу. Она была первой такой. Бешеная популярность. Очень, очень захватывает. При этом правила сильно проще, чем те, которые ты описал.

Есть и русские варианты, это просто первая.

Евгений Степанищев (bolknote.ru)
4 декабря 2013, 09:34, ответ предназначен Бабаев Александр (bealex.moikrug.ru):

Если проще, значит это совсем другая игра. У меня сегодня утром за завтраком, произошла эпичнейшая битва — я проморгал твёрдый знак, противник его занял и пока я отвлёкся на проход к «столице», противник на этом плацдарме обосновался и выиграл меня. С другими правилами это нереально :)

Бабаев Александр (bealex.moikrug.ru)
4 декабря 2013, 09:48

Конечно, я не спорю. Просто увидел похожую картинку и вспомнил про Letterpress. Там тоже бывают эпические битвы, стратегии...

Евгений Степанищев (bolknote.ru)
4 декабря 2013, 13:21

Отказался от регулярок, сделал массив комбинаций и поиск по нему, стало побыстрее.

Denis Ibaev (dionys.moikrug.ru)
4 декабря 2013, 13:26, ответ предназначен Евгений Степанищев (bolknote.ru):

Смысл-то игры не только в тактике, но и в эрудированности. А так можно было бы просто генерировать случайное число — сколько клеток тебе можно занять. Но это была бы уже другая игра. И я встречался с соперниками, которые, видно по лексикону, не сами находят слова. Играть с ними довольно трудно и не интересно, как с роботом.

Евгений Степанищев (bolknote.ru)
4 декабря 2013, 13:42, ответ предназначен Denis Ibaev (dionys.moikrug.ru):

У меня эрудированность есть, но «программы перебора» в мозгу нет.

Denis Ibaev (dionys.moikrug.ru)
4 декабря 2013, 13:46, ответ предназначен Евгений Степанищев (bolknote.ru):

Развивай.

Евгений Степанищев (bolknote.ru)
4 декабря 2013, 14:09, ответ предназначен Denis Ibaev (dionys.moikrug.ru):

А зачем? Где это может пригодиться?

Denis Ibaev (dionys.moikrug.ru)
4 декабря 2013, 14:32, ответ предназначен Евгений Степанищев (bolknote.ru):

В игре «Словохват».

Евгений Степанищев (bolknote.ru)
4 декабря 2013, 14:35, ответ предназначен Denis Ibaev (dionys.moikrug.ru):

Да я как-то не планировал выделять этой игре хоть сколько заметное место в моей жизни :)

Denis Ibaev (dionys.moikrug.ru)
4 декабря 2013, 14:48, ответ предназначен Евгений Степанищев (bolknote.ru):

Но ты же «подсел» по собственным словам, значит играть будешь достаточно часто. А я описал свои ощущения от подобных соперников. Вероятно, подобное отношение не только у меня.

Евгений Степанищев (bolknote.ru)
4 декабря 2013, 15:16, ответ предназначен Denis Ibaev (dionys.moikrug.ru):

Я вообще ни во что не играю. Так что для меня «подсел» ≈ «провёл один вечер с этой игрой».

Евгений Степанищев (bolknote.ru)
4 декабря 2013, 15:16, ответ предназначен Denis Ibaev (dionys.moikrug.ru):

А я описал свои ощущения от подобных соперников. Вероятно, подобное отношение не только у меня.
Если я не буду пользоваться своей программой, слова будут те же, просто я их буду медленнее подбирать и в таймер буду чаще не укладываться. Так что у тебя будет ощущение, что кто-то листает словарь медленно.

bolknote.ru (инкогнито)
4 декабря 2013, 18:12

Сейчас пришёл домой, попытался сыграть без программы этой. Выиграл.

Denis Ibaev (dionys.moikrug.ru)
4 декабря 2013, 20:08, ответ предназначен bolknote.ru:

Если я не буду пользоваться своей программой, слова будут те же, просто я их буду медленнее подбирать и в таймер буду чаще не укладываться. Так что у тебя будет ощущение, что кто-то листает словарь медленно.
Нет, не правда, слова нужно не только знать, но и «увидеть» среди этих букв. Так что без словаря ты не сможешь выдавать серии 10-буквенных слов, как на приведённом тобой скриншоте. (Такие серии, кстати, показатель, что играет не человек.) Разве что время будет не ограничено, да.

Евгений Степанищев (bolknote.ru)
4 декабря 2013, 20:58, ответ предназначен Denis Ibaev (dionys.moikrug.ru):

Ну, это лучший мой скриншот в общем-то :) На других не так впечатляет :) Время поиска не линейно растёт, так что я обычно задаю куда меньше букв для поиска, да и символов неудобных в этот раз мало попалось.

Евгений Степанищев (bolknote.ru)
5 декабря 2013, 14:03, ответ предназначен Denis Ibaev (dionys.moikrug.ru):

Вот моя утренняя игра без софта:

Снимок экрана 2013-12-05 в 14.54.58.pnghttp://fotki.yandex.ru/users/bolknote/view/488294/?page=3

Vladimir Moskva (fulc.ru)
11 декабря 2013, 12:30, ответ предназначен Евгений Степанищев (bolknote.ru):

Мне играть было скучновато
Неужели с программой стало интереснее? :)

Евгений Степанищев (bolknote.ru)
12 декабря 2013, 22:14, ответ предназначен Vladimir Moskva (fulc.ru):

С программой я хоть вечер поиграл и утром чуть :)

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)