Python

24 задание ЕГЭ ИНФОРМАТИКА PYTHON

2 в списке
****нестр ****
****нестр ****
129
Наплодили-то быдлокода, мама дорогая.
3 вложенных цикла, линейный поиск на каждом шагу. Множества, словари? Не, не слышал...
 with open("24-249.txt", "r") as f:
HEX = { hex(n)[2]: n for n in range(16) }
ALL = (1
В.
Владимир .
87 571
Лучший ответ
Сергей Яровой На "24-249.txt" выдало 1000000
Владимир . Ещё этот used можно было бы сделать очередью, чтоб добавлять-удалять пошустрее, но это уже константный фактор, на общую сложность алгоритма не влияющий. Алгоритм - квадратичный, в отличие от кубического быдлокодерского...
Здравствуйте!
Вот программа для Вас:
 # Загружаю файл 24-249.txt в строку string 
f = open("24-249.txt")
string = f.read()+" "
f.close()

# Задаю цифры 16-тиричной системы исчисления
s16 = "0123456789ABCDEF"
# Задаю начальное значение для минимальной длины строки
min_len = 10**6;

# Запускаю цикл для i по всем символам строки string
for i in range(0, len(string)):
# Если i-й символ строки - 16-е цифра, тогда...
if string[i] in s16:
# ... запускаю цикл для k так, чтобы от
# i-го до k-го символов было расстояние
# не меньше 16 и не больше min_len.
# 16 - так как в строке нужно, чтобы были
# все 16-тиричные цифры.
# min_len - так как если я беру строку, бОльшую,
# чем min_len, то она не нужна - ищу-то я строку
# с минимальной длиной, а это - строка длиной
# min_len или меньше
m = min(i+min_len, len(string))
for k in range(i+16, m):
# Если последний символ не 16-тиричная
# цифра, тогда перехожу к следующей итерации,
# так как такая строка не подходит
if not(string[k-1] in s16):
continue
# Вырезаю в s строку от i-го до k-1 - го
# символов
s = string[i:k]
# Выбираю для начала, что строка s мне
# подходит
finded_string = True
# Проверяю, что в этой строке есть все 16-тиричные
# символы
for char in s16:
if not (char in s):
finded_string = False
# Если строка подходит мне и её длина меньше минимальной,
# тогда выбираю её длину минимальной
if finded_string and len(s) < min_len:
min_len = len(s)
# Если строка s мне подошла, тогда нет смысла продолжать цикл
# для k. Потому что дальше будут строки только с бОльшей длиной
if finded_string:
break
# Вывожу минимальную длину на экран
print(min_len)
Сергей Яровой Я проверил на файле 24-249.txt и он действительно выдал 42.
Но потом я проверил на файле, содержащем "000000s1s2s3s4s5s6s7s8s9sasbscsdsesf5tttt010023456789abcdef". Он выдал 1000000. Мне кажется это неправильно.
Тигран Саркисян
     if string[i] in s16:  
# ... запускаю цикл для k так, чтобы от
# i-го до k-го символов было расстрояние
# не меньше 16 и не больше min_len.
# 16 - так как в строке нужно, чтобы были
# все 16-тиричные цифры.
# min_len - так как если я беру строку, бОльшую,
# чем min_len, то она не нужна - ищу-то я строку
# с минимальной длиной, а это - строка длиной
# min_len или меньше
m = min(i+min_len, len(string))
for k in range(i+16, m):
# Если последний символ не 16-тиричная
# цифра, тогда перехожу к следующей итерации,
# так как такая строка не подходит
if not(string[k-1] in s16):
continue
Тигран Саркисян
             # Вырезаю в s строку от i-го до k-1 - го   
# символов
s = string[i:k]
# Выбираю для начала, что строка s мне
# подходит
finded_string = True
# Проверяю, что в этой строке есть все 16-тиричные
# символы
for char in s16:
if not (char in s):
finded_string = False
# Если строка подходит мне и её длина меньше минимальной,
# тогда выбираю её длину минимальной
Тигран Саркисян
             if finded_string and len(s) < min_len:    
min_len = len(s)
# Если строка s мне подошла, тогда нет смысла продолжать цикл
# для k. Потому что дальше будут строки только с бОльшей длиной
if finded_string:
break
# Вывожу минимальную длину на экран
if min_len == 10**6 + 1:
print("Строки, содержащей все 16-тиричные цифры, в файле нет.")
else:
print(min_len)
Алексей Усов 3 вложенных цикла, когда всё решается конечным автоматом линейной сложности и 16-ю счётчиками состояния. Вот это жесть.
---
Daur D.d.e
Daur D.d.e
315