Мотивация : иногда определенные элементы в списке не учитываются при подсчете итогов. Например, подсчет пассажиров самолета в рядах, где дети сидят на коленях у родителей.
Задача : написать программу для разбиения списка элементов на куски. Каждый блок (кроме, возможно, последнего) имеет одинаковый размер , где размер определяется как число элементов, передающих функцию предиката.
Правила :
- Ваша программа должна занять
- список предметов
- положительный целочисленный размер куска
- функция предиката (принимает элемент и возвращает истину или ложь)
- Вы должны вернуть входной список, разбитый на куски
- Каждый кусок представляет собой список элементов
- В целом, предметы должны оставаться в том же порядке, ни один из которых не игнорируется.
- Количество элементов, передаваемых предикатом в каждом чанке (кроме, возможно, последнего), должно соответствовать размеру входного чанка.
- элементы, не соответствующие предикату, не должны учитываться в этом размере
- Элементы, не соответствующие предикату:
- все еще включены в выходные чанки
- выделяется для самого раннего чанка, в случае, если чанк «полон», но следующие элементы не соответствуют предикату
- таким образом, последний кусок может не состоять исключительно из элементов, не соответствующих предикату
- Конечный кусок может иметь размер меньше размера фрагмента, потому что все элементы были учтены.
Неисчерпывающие примеры:
Простейший пример - рассмотреть 1s и 0s, где есть функция предиката x ==> x > 0. В этом случае sumкаждый блок должен соответствовать размеру блока.
- элементы:,
[]размер:,2предикат:x > 0->[]или[[]] - элементы:,
[0, 0, 0, 0, 0, 0]размер:,2предикат:x > 0->[[0, 0, 0, 0, 0, 0]] - элементы:,
[0, 1, 1, 0]размер:,2предикат:x > 0->[[0, 1, 1, 0]] - элементы:,
[0, 1, 1, 0, 1, 0, 0]размер:,2предикат:x > 0->[[0, 1, 1, 0], [1, 0, 0]] - элементы:,
[0, 1, 0, 0, 1, 0, 1, 1, 0]размер:,2предикат:x > 0->[[0, 1, 0, 0, 1, 0], [1, 1, 0]]
И давайте закончим с пассажирами самолета, где дети сидят на коленях у родителей . Aдля взрослого, bдля ребенка, плоскость ряда 3широкая, взрослый всегда указан перед своим ребенком:
- элементы:,
[A, b, A, b, A, A, A, b, A, b, A, A, b]размер:,3предикат:x => x == A->[[A, b, A, b, A], [A, A, b, A, b], [A, A, b]]