Неочевидное поведение

Рейтинг: -1Ответов: 1Опубликовано: 19.06.2023

Решаю задачу из ЕГЭ по информатике, ее условие:

Петя составляет 8 буквенные слова из букв ЭКЗАМЕН. Каждую букву можно использовать любое количество раз или не использовать вообще. В каждом слове количество гласных и согласных букв должно отличаться ровно на 2, а буквы в середине слова (4-ая и 5-ая по порядку) обязательно должны быть разными. Сколько таких слов может составить Петя?

Использую самый простой переборный алгоритм, но столкнулся с совсем неочевидным поведением. Посчитать разность гласных и согласных букв можно разными способами, я придумал два и хочу, чтобы при их использовании получался одинаковый ответ. Загвоздка состоит в том, что когда я использую первый способ отдельно от второго, а потом вместе со вторым, у меня получаются разные результаты.

def solve(s):
    n_glas = 0
    n_soglas = 0
    for c in s:
        n_glas += (c in glas)
        n_soglas += (c in soglas)
    return [n_glas, n_soglas]

glas = set(["Э", "А", "Е"])
soglas = set(["К", "З", "М", "Н"])

count1 = 0
count2 = 0
for a in "ЭКЗАМЕН":
    print(a)
    for b in "ЭКЗАМЕН":
        for c in "ЭКЗАМЕН":
            for d in "ЭКЗАМЕН":
                for e in "ЭКЗАМЕН":
                    for f in "ЭКЗАМЕН":
                        for g in "ЭКЗАМЕН":
                            for h in "ЭКЗАМЕН":
                                s = a + b + c + d + e + f + g + h

                                # n_glas, n_soglas = solve(s)
                                n_glas = 0
                                n_soglas = 0
                                for c in s:
                                    n_glas += (c in glas)
                                    n_soglas += (c in soglas)

                                n_glas_ = s.count("Э") + s.count("А") + s.count("Е")
                                n_soglas_ = s.count("К") + s.count("З") + s.count("М") + s.count("Н")

                                if abs(n_glas - n_soglas) == 2 and d != e:
                                    count1 += 1

                                if abs(n_glas_ - n_soglas_) == 2 and d != e:
                                    count2 += 1

print(count1, count2)

Если запустить этот код, результат будет такой: 2213568 2213568. Это неверный ответ. Если раскомментировать строку:

# n_glas, n_soglas = solve(s)

и закомментировать строки под ней (отвечающие за формирование переменных n_glas, n_soglas):

n_glas = 0
n_soglas = 0
for c in s:
    n_glas += (c in glas)
    n_soglas += (c in soglas)

то результат будет: 2098656 2098656, и это ответ верный. Хотя функция solve содержит тот же самый код, что указан в цикле. Вопрос, в чем причина такого поведения? Как вообще код, формирующий переменные n_glas и n_soglas может влиять на совершенно другие переменные? Мне ничего не ясно в этой ситуации.

P. S. Хочу отметить, что ЕГЭ сдаю не я.

Ответы

▲ 3Принят
 for c in "ЭКЗАМЕН":
  .....
    for c in s: