Неочевидное поведение
Решаю задачу из ЕГЭ по информатике, ее условие:
Петя составляет 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. Хочу отметить, что ЕГЭ сдаю не я.