Я только начинаю изучать 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] + '}')
Спасибо.
что мне делать вместо этого?
@StephenAlkalineЕсть ли причина, по которой вы не используете цикл?
Прежде всего, используйте лучшие имена переменных — нет ничего плохого в том, чтобы использовать слова вместо 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)
Затем подумайте о том, что вы хотите:
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, чтобы понять это, но пока я внедрил его в свой код, и он отлично работает!
Когда предполагаемое слово «получатель платежа», код не работает и говорит:
Трассировка (последний последний вызов): Файл "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'
@StephenAlkaline, надеюсь, исправлено.
Допустим, в 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 - в правильном положении
Мне лично не нравится смотреть на 15 печатных заявлений