пытаюсь решить задачу "Отгадай слово". Python
Не знаю как заставить работать код правильно. Запутался с решением, и у меня не срабатывает условие else. В итоге ответ, не совпадает.
def guess_word(S: str, Q: str):
answers = []
for i in range(len(S)):
if S[i] == Q[i]:
answers.append("correct")
elif Q[i] != S[i]:
for j in range(len(Q)):
if Q[i] == S[j] and Q[j] != S[j]:
answers.append('present')
else:
answers.append("absent")
return answers
if __name__ == "__main__":
S = input()
Q = input()
print(*guess_word(S, Q), sep="\n")
Саша разрабатывает игру «Отгадай слово». В этой игре, игрок должен отгадать загаданное слово из N букв за несколько попыток. В данный момент перед Сашей стоит задача написать логику проверки величины совпадения попытки игрока с загаданным словом.
Более формально, пусть есть строка S — загаданное слово и строка Q — попытка игрока. Обе строки имеют одинаковую длину N. Для каждой позиции 1 ≤ i ≤ N строки Q, нужно вычислить тип совпадения в этой позиции со строкой S.
Если Qi=Si, то в позиции i тип совпадения должен быть равен correct.
Если Qi≠Si, но существует другая позиция 1≤j≤N, такая что Qi=Sj, то в позиции i тип совпадения должен быть равен present.
Каждую букву строки S можно использовать не более чем в одном совпадении типа correct или present. Приоритет всегда отдается типу correct. Из всех возможных вариантов использования в типе present программа Саши выбирает самую левую позицию в строке Q. В остальных позициях тип совпадения должен быть равен absent.
Примечания
Пояснение к первому тестовому примеру. Q1=S1 и Q5=S5, поэтому для позиций 1 и 5 ответ correct. Q3=S4, поэтому для позиции 3 ответ present. Буквы L и A не встречаются в строке S, поэтому для позиций 2 и 4 ответ absent.
Пояснение ко второму тестовому примеру. Q1=S1 и Q4=S4, поэтому для позиций 1 и 4 ответ correct. Буква A больше не встречается в строке S, поэтому для позиций 2 и 3 ответ absent.
Пояснение к третьему тестовому примеру. Q2=S2, поэтому для позиции 2 ответ correct. Q1=S4, Q3=S1 и Q4=S3, поэтому для позиции 1, 3 и 4 ответ present. Буква A встречается в строке S в позиции 1, но она уже участвует в совпадении present (Q3=S1), поэтому для позиции 5 ответ absent.
Пример 1:
Ввод: Вывод:
COVER correct
CLEAR absent
present
absent
correct
Пример 2:
Ввод: Вывод:
ABBA correct
AAAA absent
absent
correct
Пример 3:
Ввод: Вывод:
ABCBC present
BBACA correct
present
present
absent
Ответы (2 шт):
Основная проблема: этот код никогда не напишет "absent", потому что S[i] либо равно Q[i] (тогда выполняется ветка if), либо не равно Q[i] (тогда выполняется ветка elif). Ветка else никогда не будет выполняться, потому что нет таких двух букв, которые и одинаковы и неодинаковы одновременно.
Поэтому нужно или изменить условие, или вообще избавиться от второго условия. Пойдем по первому пути. Т.к. ситуация, когда угадываемая буква находится на верной позиции уже обработана в if, то в elif можно просто проверить, есть ли такая буква в слове:
def guess_word(S: str, Q: str):
answers = []
for i in range(len(S)):
if Q[i] == S[i]:
answers.append("correct")
elif Q[i] in S:
answers.append('present')
else:
answers.append("absent")
return answers
Вторая проблема - названия переменных, из-за этого страдает читаемость и непонятно, что в чем проверяется. Например, в одном месте стоит S[i] == Q[i], а дальше Q[i] != S[i]. Технически разницы никакой, но когда пытаешься понять, что делает код - запутывает.
Антон, вот ваш исправленный код для игры "быки и коровы" (скорее всего сможете нагуглить что-то поминимальнее, но я исправлял "в лоб" ваш код, так как вы о нём спрашивали) - проверен на ваших примерах.
Все коррекции откомментированы прямо в коде.
У вас было две основных ошибки - не там ("absent") (это вы и сами видели), и вы не отмечали уже использованные буквы.
Кроме того, PEP-8 не рекомендует использовать для таких переменных прописные буквы, но это я не трогал, на функционирование не влияет.
def guess_word(S: str, Q: str):
answers = []
for i in range(len(S)):
# Отмечаем, нашли ли букву
is_find = False
if S[i] == Q[i]:
answers.append("correct")
# Больше букву не обрабатываем в дальнейшем
S_used[i] = False
elif Q[i] != S[i]:
for j in range(len(Q)):
# Расширили условие - не "использовали" ли букву?
if Q[i] == S[j] and Q[j] != S[j] and S_used[j]:
answers.append('present')
# Больше букву не обрабатываем
S_used[j] = False
is_find = True
# нашли букву
break
#Не нашли букву
if not is_find:
answers.append("absent")
# Эта часть не нужна
#else:
# answers.append("absent")
return answers
if __name__ == "__main__":
S = input()
Q = input()
# Отмечаем в S_used "использованные" буквы
S_used = [True]*len(S)
print(*guess_word(S, Q), sep="\n")