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

1

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

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

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

Любые идеи?

  • 2
    По какой логике Beer не в порядке, а Zebra порядке? Правило 1 говорит, что они оба не в порядке, правило 2 говорит, что они оба в порядке, и ваши утверждения / примеры говорят о них по-разному. Выглядит как противоречие для меня.
  • 1
    @Alex: Алекс: Zebra плохая по второму условию, но не по первому. Mutatis mutandis для Beer . Любое условие подразумевает потерю.
Теги:
logic

1 ответ

6
Лучший ответ

Вы преувеличиваете вещи. Если новый фрагмент составляет менее 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 )
  • 0
    Это работает чудесно. Как я могу научиться несложно мой код?
  • 0
    Я пишу это в псевдокоде на доске. words - это строка, поэтому я могу проверить каждое слово определенной длины относительно текущего слова. Если они совпадают, то мы знаем, что можно добавить хотя бы еще одну букву.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню