Itertools на Python: фильтрация декартова произведения параметров

Напишите решение на Python и проверьте его на странице.

Другие упражнения по этой теме: Itertools в Python: задачи на комбинации, groupby и ленивые потоки.

Окно активации параметров

Калибровочный стенд проводит серию тестов, перебирая декартово произведение трёх параметров из независимых списков. Перебор идёт строго по порядку: значения первого параметра меняются медленнее всего, а третьего — быстрее всего. Конвейер отсекает все начальные комбинации до тех пор, пока сумма параметров в очередном кортеже впервые не достигнет нижнего порога допуска (сумма ).

Как только такая стартовая точка найдена, стенд начинает выдавать все последующие комбинации подряд. На этом этапе индивидуальная сумма параметров уже не проверяется на нижний допуск: поток продолжается до первого кортежа, сумма которого строго превышает верхний критический порог (сумма ). Сам этот критический кортеж в результат никогда не включается, а чтение декартова произведения прекращается в момент его обнаружения. Если же самый первый кортеж, достигший допуска, одновременно превышает и верхний порог, он считается критическим — стенд мгновенно останавливает перебор и не выдаёт ни одной комбинации.

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

Что уже дано

В среде выполнения доступна вспомогательная функция parameter_product(first, second, third), создающая итератор декартова произведения по трём переданным спискам. Реализовывать её самостоятельно не нужно. В редакторе вам предстоит написать тело функции-генератора activation_window.

Что нужно сделать

Реализуйте функцию-генератор activation_window(combinations, low, high).

Функция принимает три аргумента:

  • combinations — итератор декартова произведения, выдающий числовые тройки вида (p1, p2, p3);
  • low и high — целые числа в диапазоне от -3 000 000 до 3 000 000 (соотношение между ними может быть любым).

Каждый из трёх исходных списков параметров содержит от 0 до 100 целых чисел в диапазоне от -1 000 000 до 1 000 000, а общий размер произведения не превышает 10 000 троек. Списки могут быть неотсортированными и содержать повторяющиеся значения.

Правила фильтрации потока:

  • Пропускайте начальные тройки до тех пор, пока сумма элементов кортежа sum(triple) впервые не станет больше либо равна low. Эта тройка активирует поток.
  • После активации выдавайте через yield каждую очередную тройку в исходном декартовом порядке, сохраняя дубликаты. На этом этапе значения троек уже не сравниваются с порогом low: они выдаются даже тогда, когда их сумма опускается ниже low.
  • Поток активен до первого кортежа, сумма которого строго больше high (sum(triple) > high). Этот критический кортеж извлекается из combinations, но ни в коем случае не выдаётся наружу. Всякая последующая выборка из combinations немедленно прекращается.
  • Значение суммы, в точности равное high, допускается и выдаётся генератором.
  • Если первая же активирующая тройка одновременно превышает порог high, она считается критической: генератор прекращает работу и не выдаёт ни одного элемента.
  • Если ни одна тройка не достигла порога low, генератор исчерпывает входной поток и ничего не возвращает.
  • Генератор обязан работать лениво: не делайте вызовов next(combinations) в момент создания генератора и не считывайте элементы вперёд следующего запроса потребителя. Запрещено материализовать входной итератор в списки или сортировать его.

Ввод и вывод

Стандартные потоки ввода stdin и вывода stdout в решении не используются: считывать ввод и вызывать print() не нужно. После выполнения кода учащегося проверяющая система считывает из пространства имён модуля функцию верхнего уровня activation_window и вызывает её с проверочными аргументами.

Пример использования

combinations = parameter_product([0], [0], [1, 4, 0, 5, 6, 2])
print(list(activation_window(combinations, 4, 5)))

Вывод:

[(0, 0, 4), (0, 0, 0), (0, 0, 5)]
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи