Справка по Python Logic: - PullRequest
       4

Справка по Python Logic:

1 голос
/ 02 сентября 2010

Я пишу игру, в которой есть два условия проигрыша:

  1. Формирование слова длиннее 3 букв.Пчела в порядке, пиво - нет.
  2. Формируем слово, которое нельзя превратить в более длинное слово.Зебра в порядке, Зебры нет.

Список слов - это список слов, фрагмент - это предыдущий фрагмент, а - это новая буква, которую вводит игрок.так что frag может выглядеть как «app» и, возможно, «l» с идеей формирования слова apple.

def getLoser(frag, a, wordlist):
word = frag + a

if len(word) > 3:

    if word in wordlist:
        print 'word in wordlist'
        return True

    else:
        for words in wordlist:
            if words[:len(word)] == word:
                print words,':', word
                print 'valid word left'
                return False

            else: 
                print words[:len(word)]
                print words,':', word
                print 'false found'
                return True
else:
    return False

По какой-то причине, когда я ввожу свое 4-е письмо, оно автоматически переходит к другому вдля цикла for, даже если оператор if в цикле for работает правильно, когда я проверяю его в одиночку на фиктивных данных в интерактивном трейле.

Здесь выводятся фрагменты alg и буква e со словом алгебра всписок слов.

e

aa

aa: alge

false found

True

Есть идеи?

1 Ответ

6 голосов
/ 02 сентября 2010

Вы слишком усложняете вещи.Если новый фрагмент меньше 3 букв, он автоматически в порядке.Если нет, то это должно быть начало некоторого слова и , а не само слово, чтобы быть в порядке.

>>> words = { "apple" }
>>> def isOK( fragment, letter ):
...     word = fragment + letter
...     if len( word ) <= 3: return True
...     return word not in words and any( w.startswith( word ) for w in words )
...
>>> isOK( "a", "p" )
True
>>> isOK( "ap", "p" )
True
>>> isOK( "app", "l" )
True
>>> isOK( "appl", "l" )
False
>>> isOK( "appl", "e" )
False

(было бы возможно объединить два вышеупомянутых теста в одно условноеутверждение:

return len( word ) <= 3 or word not in words and any( w.startswith( word ) for w in words )

но я думаю, что это слишком неясно.)

Я не могу следовать логике вашего кода выше;это довольно запутанно написано.(Почему, например, words строка?) Попробуйте написать логику игры в псевдокоде, прежде чем пытаться ее реализовать - это может помочь вам разобраться в своих мыслях.версия:

def isOK( word ):
    condition_one = len( word ) > 3 and word in words
    condition_two = not any( w.startswith( word ) for word in words )

    return not( condition_one or condition_two )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...