Почему регулярное выражение и итерационный код дают разную длину максимальной 14-ричной чётной последовательности?
Работаю с задачей из ЕГЭ (№79737 на решуЕгэ): Текстовый файл состоит из десятичных цифр и заглавных букв латинского алфавита.
Определите в этом файле последовательность идущих подряд символов, представляющих собой запись максимального чётного 14-ричного числа. В ответе запишите количество символов (значащих цифр в записи числа) в этой последовательности.
Примечание. Латинские буквы A, B, C и D означают цифры из алфавита 14-ричной системы счисления.
Файл: https://inf-ege.sdamgia.ru/get_file?id=214083
Моё решение Итерационный код (Python):
f=open("1_24.txt")
s=""
for i in f:
s+=i
a="0123456789ABCD"
b="02468AC"
n=""
mx=0
for i in s:
if i in a:
n+=i
else: #QQ n=""
if len(n)>0 and n[-1] in b:
mx=max(mx, len(n))
n=""
if len(n)>0 and n[-1] in b:
mx=max(mx, len(n))
print(mx)#865 выдает
а вот ответ, который выложен на задачку:
import re
string = open('1_24.txt').readline()
pattern = r'[123456789AB][0123456789ABС]*[02468AС]'
iterator = re.finditer(pattern, string)
otv = max([i.group() for i in iterator], key=len)
print(len(otv))
Вопрос: Почему итерационная реализация даёт результат 865, а регулярное выражение — 2598? Какое поведение правильное? И может ли проблема быть в самом регулярном выражении (например, из-за русской буквы С)?
Ответы (1 шт):
Проблема в том, что после рекордной последовательности в файле идут такие символы:
[рекордная последовательность]7V
Коду на регулярках всё-равно, он эту последовательность находит правильно. А ваш код доходит до символа V, после чего проверяет на чётность цифру 7, обламывается, и выбрасывает рекордную последовательность.
Доделки кода, чтобы он выдавал тоже самое, что и регулярка:
for ch in s:
if ch in allowed:
if n or ch != '0':
n += ch
else:
n = ""
# проверка кандидата
if n and n[-1] in even:
mx = max(mx, len(n))
Суть изменений:
- Первая цифра не может быть
0 - Проверяем кандидатов на каждом шаге алгоритма, а не только при обрыве последовательности