Я пишу игру, где есть два проигрыша:
Wordlist - это список слов, фрагмент - это предыдущий фрагмент, а a - новая буква, в которую входит игрок. поэтому фрагмент может выглядеть как "приложение" и, возможно, "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
По какой-то причине, когда я ввожу свою четвертую букву, она автоматически переходит к else в цикле for, даже если оператор if функционирует в цикле for, работает правильно, когда я тестирую его только на фиктивных данных в интерактивном трейле.
Здесь выводятся для frag alg и буквы e с помощью словарной алгебры в списке слов.
е
аа
aa: alp
false found
True
Любые идеи?
Вы преувеличиваете вещи. Если новый фрагмент составляет менее 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 )
Beer
не в порядке, аZebra
порядке? Правило 1 говорит, что они оба не в порядке, правило 2 говорит, что они оба в порядке, и ваши утверждения / примеры говорят о них по-разному. Выглядит как противоречие для меня.Zebra
плохая по второму условию, но не по первому. Mutatis mutandis дляBeer
. Любое условие подразумевает потерю.