Изменение отображения букв при дублировании при воссоздании Wordle

Я только начинаю изучать Python и пытаюсь сделать Wordle. Это то, что я сделал до сих пор с «gWs», являющимся переменной для угаданного слова, разделенного на список, где каждая буква слова является элементом в списке. «cWs» — это то же самое, что и «gWs», но для правильного слова, которое выбирается случайным образом. Код сравнивает, совпадают ли все буквы обоих слов в слове или нет в слове. Я не могу понять, как сделать так, чтобы если в угаданном слове было 2 или более одинаковых букв, а в правильном слове только одна из этих букв, то выводилось, что одна буква в слове или в правильном месте , а то и другого нет в слове.

    if gWs[0] == cWs[0]:
        print('[' + gWs[0] + ']', end=' ')
    elif gWs[0] in cWs:
        print('|' + gWs[0] + '|', end=' ')
    elif gWs[0] in cWs:
        print('|' + gWs[0] + '|', end=' ')
    else:
        print('{' + gWs[0] + '}', end=' ')
    
    if gWs[1] == cWs[1]:
        print('[' + gWs[1] + ']', end=' ')
    elif gWs[1] in cWs:
        print('|' + gWs[1] + '|', end=' ')
    else:
        print('{' + gWs[1] + '}', end=' ')
    
    if gWs[2] == cWs[2]:
        print('[' + gWs[2] + ']', end=' ')
    elif gWs[2] in cWs:
        print('|' + gWs[2] + '|', end=' ')
    else:
        print('{' + gWs[2] + '}', end=' ')
    
    if gWs[3] == cWs[3]:
        print('[' + gWs[3] + ']', end=' ')
    elif gWs[3] in cWs:
        print('|' + gWs[3] + '|', end=' ')
    else:
        print('{' + gWs[3] + '}', end=' ')
    
    if gWs[4] == cWs[4]:
        print('[' + gWs[4] + ']')
    elif gWs[4] in cWs:
        print('|' + gWs[4] + '|')
    else:
        print('{' + gWs[4] + '}')

Спасибо.

Мне лично не нравится смотреть на 15 печатных заявлений

Fishball Nooodles 20.03.2022 04:54

что мне делать вместо этого?

Stephen Alkaline 20.03.2022 06:34

@StephenAlkalineЕсть ли причина, по которой вы не используете цикл?

Samathingamajig 20.03.2022 07:35
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
43
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Прежде всего, используйте лучшие имена переменных — нет ничего плохого в том, чтобы использовать слова вместо 3-буквенные аббревиатуры.

Затем измените свой код, чтобы он использовал циклы и перечислял проверки.

Поместите проверку в функцию для повторного использования — верните строку сборки. Не печатайте с помощью end = "" — вместо этого соберите детали в список и .join() их перед возвратом.

def yours_fixed(correctWord, guess):
    # loop instead of if - elif - elif - elif for each letter position
    result = []
    for pos,letter in enumerate(guess):
        if letter == correctWord[pos]:
            result.append(f"[{letter}]")
        elif letter in correctWord:
            result.append(f"|{letter}|")
        else:
            result.append(f"{{{letter}}}")

    return " ".join(result)

Затем подумайте о том, что вы хотите:

  • как-то считать буквы
  • если буква разрешается, удалите 1 из счетчика и удалите, если счетчики равны 0
  • сделайте проверку и распечатайте с подсчетом dict не против слова
def better_checkWords(correctWord, guess):
    # use collection.Counter to get the same but more effective
    letterCount = {a: correctWord.count(a) for a in set(correctWord)}
    def removeLetter(l):
        if letter in letterCount:
            letterCount[letter] -= 1
            if letterCount[letter] == 0:
                del letterCount[letter]

    result = []
    for pos,letter in enumerate(guess):

        if letter == correctWord[pos]:
            result.append(f"[{letter}]")
            removeLetter(letter)
        elif letter in letterCount:  # check if letter still in
            result.append(f"|{letter}|")
            removeLetter(letter)
        else:
            result.append(f"{{{letter}}}")

    return " ".join(result)

correctWord = "aabcd"
guess = "abaax"
print( yours_fixed(correctWord, guess))
print( better_checkWords(correctWord, guess))

Выход:

# "aabcd" correct
# "abaax" guessed

[a] |b| |a| |a| {x}  # yours
[a] |b| |a| {a} {x}  # better one

Спасибо за полезные указатели! Мне определенно нужно продолжить курс Python, чтобы понять это, но пока я внедрил его в свой код, и он отлично работает!

Stephen Alkaline 21.03.2022 01:27

Когда предполагаемое слово «получатель платежа», код не работает и говорит:

Stephen Alkaline 21.03.2022 04:04

Трассировка (последний последний вызов): Файл "c:\users\zepha\mu_code\programs\wordle2.0.py", строка 77, в <module> print(checkWords(correctWord, guessWord)) Файл "c:\users \zepha\mu_code\programs\wordle2.0.py", строка 24, в checkWords removeLetter(letter) File "c:\users\zepha\mu_code\programs\wordle2.0.py", строка 17, в removeLetter letterCount[ буква] -= 1 KeyError: 'e'

Stephen Alkaline 21.03.2022 04:04

@StephenAlkaline, надеюсь, исправлено.

Patrick Artner 21.03.2022 09:17

Допустим, в gWs больше одной буквы l, а в cWs ровно одна l. Вы можете сделать что-то вроде

flag = [0] * len(gWs)
for i, x in enumerate(gWs):
    if x == l:
        if i == cWs.index(x):
            flag[i] = 2
        else:
            flag[i] = 1

Теперь согласно flag:

0 - нет в cWs

1 - в cWs, но не в том месте

2 - в правильном положении

Другие вопросы по теме