пытаюсь решить задачу "Отгадай слово". 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")

→ Ссылка