Python

Python. Задание из ЕГЭ по информатике

Вот, к примеру:
 from math import prod
from re import match

def digiter(n):
while n != 0: yield n % 10; n //= 10

def nwise(it, n):
lst = [next(it) for _ in range(n)]; yield lst
for elem in it:
lst = lst[1:] + [elem]; yield lst

with open("17a003.txt", "r") as file:
first = int(next(file))
mn, mx = first, first
prods = [prod(digiter(first))] + [
(mn := min(mn, n), mx := max(mx, n), prod(digiter(n)))[-1]
for s in file for n in [int(s)]]

d = (mx - mn) * (mx - mn)
tprods = (p for t in nwise(iter(prods), 3)
for p in [prod(t)] if p 0 else ["Троек не найдено"])
На ваших данных троек не найдено, т.к. нигде произведение цифр тройки не соответствует шаблону "*202*3*".

По шагам:

Открываем файл.

Строим список (prods) из произведений цифр отдельных элементов, попутно запоминая максимальный и минимальный элементы. Максимум и минимум ставятся в значение первого элемента, а затем пробегом по файлу мы их уточняем.
Как только у нас есть список, открытый файл больше не требуется, и дальнейший код идёт вне блока with, т.е. файл уже закрыт.

Теперь мы переходим к обработке троек. На основе итератора произведений цифр отдельных чисел мы строим итератор (tprods) из произведений цифр троек, удовлетворяющих условию задачи. К примеру, если первый итератор произведений возвращает их в таком порядке:
 1536, 1568, 21000, 7680, 16128, ... 
то в nwise они пойдут так:
 [1536, 1568, 21000], [1568, 21000, 7680], [21000, 7680, 16128], ... 
prod преобразует эти маленькие списки в произведения, а условие отсеет лишние произведения (которых большинство).
Проверку шаблона делаем при помощи регулярок на строковом представлении числа. Можно было обойтись без регулярок и перевода в строку, но алгоритм от этого не стал бы ни проще, ни быстрее.

Дальше вычисляем минимальное произведение, попутно подсчитывая их количество. Если произведений, удовлетворяющих условию, не нашлось, то количество (k) останется нулём, а min вернёт значение по умолчанию из параметра default.

И в конце выводим либо результат, либо сообщение, что подходящих троек не нашлось.

Сложность алгоритма - линейная, обработка выполняется в два прохода: первый - по файлу, второй - по списку произведений цифр в памяти. Меньше - не получится, т.к. по мере пробега последовательности минимум уменьшается, максимум увеличивается, критерий отбора произведений расширяется, и поэтому приходится хранить их все, пока точно не узнаем максимум и минимум.
Александр Гаврилюк
Александр Гаврилюк
87 571
Лучший ответ
ответ 1012
Максим Зыкин код хотелось бы