Почему регулярное выражение и итерационный код дают разную длину максимальной 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 шт):

Автор решения: CrazyElf

Проблема в том, что после рекордной последовательности в файле идут такие символы:

[рекордная последовательность]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
  • Проверяем кандидатов на каждом шаге алгоритма, а не только при обрыве последовательности
→ Ссылка