Вы слишком усложняете вещи.Если новый фрагмент меньше 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 )