Мотивация : иногда определенные элементы в списке не учитываются при подсчете итогов. Например, подсчет пассажиров самолета в рядах, где дети сидят на коленях у родителей.
Задача : написать программу для разбиения списка элементов на куски. Каждый блок (кроме, возможно, последнего) имеет одинаковый размер , где размер определяется как число элементов, передающих функцию предиката.
Правила :
- Ваша программа должна занять
- список предметов
- положительный целочисленный размер куска
- функция предиката (принимает элемент и возвращает истину или ложь)
- Вы должны вернуть входной список, разбитый на куски
- Каждый кусок представляет собой список элементов
- В целом, предметы должны оставаться в том же порядке, ни один из которых не игнорируется.
- Количество элементов, передаваемых предикатом в каждом чанке (кроме, возможно, последнего), должно соответствовать размеру входного чанка.
- элементы, не соответствующие предикату, не должны учитываться в этом размере
- Элементы, не соответствующие предикату:
- все еще включены в выходные чанки
- выделяется для самого раннего чанка, в случае, если чанк «полон», но следующие элементы не соответствуют предикату
- таким образом, последний кусок может не состоять исключительно из элементов, не соответствующих предикату
- Конечный кусок может иметь размер меньше размера фрагмента, потому что все элементы были учтены.
Неисчерпывающие примеры:
Простейший пример - рассмотреть 1
s и 0
s, где есть функция предиката 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]]