(А. Михайлов) Текстовый файл состоит из десятичных цифр и заглавных букв латинского алфавита.
Определите в этом файле последовательность идущих подряд символов, представляющих собой запись максимального нечётного 16-ричного числа.
В ответе запишите индекс (номер) первого символа (первой значащей цифры), с которого начинается запись этого числа в прилагаемом файле.
Нумерация символов в текстовом файле начинается с нуля.
Примечание.
Латинские буквы A, B, C, D, E, F — цифры из алфавита 16-ричной системы счисления.
Решение
Regexp
🔹 Шаг 1. Подключаем re и читаем файл
import re
s = open("24.txt").read()
📌 Подключаем re и читаем файл — длинная «лента» из цифр и латинских букв.
🔹 Шаг 2. Задаём множество нечётных hex-цифр: 1, 3, 5, 7, 9, B, D, F
odd = set("13579BDF")
best_val = -1
ans = 0
📌 Задаём множество нечётных hex-цифр: 1, 3, 5, 7, 9, B, D, F — по последней цифре узнаём, что число нечётное.
🔹 Шаг 3. finditer ищет все куски из символов 0–9 и A–F — это кандидаты в…
for m in re.finditer(r"[0-9A-F]+", s):
raw = m.group()
i = 0
while i < len(raw) - 1 and raw[i] == "0":
i += 1
body = raw[i:]
📌 finditer ищет все куски из символов 0–9 и A–F — это кандидаты в 16-ричные числа. У каждого куска отбрасываем ведущие нули (значащая запись).
🔹 Шаг 4. Если число нечётное
if body[-1] not in odd:
continue
val = int(body, 16)
if val > best_val:
best_val = val
ans = m.start() + i
📌 Если число нечётное — сравниваем его значение int(..., 16) с текущим максимумом и запоминаем индекс первой значащей цифры.
🔹 Шаг 5. Жми RUN
print(ans)
📌 Жми RUN — в выводе будет 8551770 (индекс начала самого большого нечётного hex-числа).
✅ Ответ: 8551770
🔹 Полный код
import re
s = open("24.txt").read()
odd = set("13579BDF")
best_val = -1
ans = 0
for m in re.finditer(r"[0-9A-F]+", s):
raw = m.group()
i = 0
while i < len(raw) - 1 and raw[i] == "0":
i += 1
body = raw[i:]
if body[-1] not in odd:
continue
val = int(body, 16)
if val > best_val:
best_val = val
ans = m.start() + i
print(ans)