Itertools на Python: объедините генераторы в непрерывный поток

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

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

Окно спектральных измерений

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

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

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

Что уже дано

В среде выполнения уже доступна вспомогательная функция make_spectrum_series(rows), создающая однократные потоковые серии для локальной отладки. Реализовывать её самостоятельно не нужно. В редакторе представлена заготовка функции spectrum_window(series, skip, count).

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

Реализуйте функцию spectrum_window(series, skip, count).

Параметры функции:

  • series — однократный внешний итератор, выдающий однократные внутренние итераторы измерений;
  • skip — целое неотрицательное число (0 <= skip <= 2048), определяющее количество начальных измерений, которые нужно пропустить суммарно по всему сквозному потоку;
  • count — целое положительное число (1 <= count <= 64), задающее максимальное количество измерений в результирующем окне.

Функция должна возвращать однократный ленивый итератор целых чисел.

Правила потоковой обработки:

  • При самом вызове spectrum_window(series, skip, count) не должно происходить никаких чтений ни из внешнего итератора series, ни из внутренних генераторов серий.
  • Измерения считываются строго по требованию для получения очередного значения. Запрещены преждевременная материализация всего сквозного потока и чтение будущих серий наперёд.
  • Переход к следующей серии выполняется только после того, как текущая серия полностью исчерпана. Пустые серии пропускаются с сохранением исходного порядка.
  • Первые skip показаний суммарно отбрасываются, после чего возвращается не более count измерений. Точные целочисленные значения, исходный порядок и дубликаты сохраняются.
  • Как только выдано count значений, итератор немедленно завершает работу: никаких дополнительных попыток чтения (next()) из внутреннего или внешнего итератора производиться не должно.
  • Если внешний источник пуст, внутренние серии пусты или смещение skip выходит за пределы суммарного числа измерений, итератор отдаёт доступный остаток данных (вплоть до пустого результата без ошибок).
  • Границы входных данных: количество серий от 0 до 20, количество измерений в одной серии от 0 до 64, значения измерений от -1 000 000 до 1 000 000.

Ввод и вывод

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

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

series = make_spectrum_series([[10, 11], [], [20, 21], [30]])
window = spectrum_window(series, 1, 3)
print(list(window))

Вывод:

[11, 20, 21]
РешениеPython

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

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

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