Motivação : Às vezes, certos itens de uma lista não contam para o seu total. Por exemplo, contando passageiros de avião em filas, onde os bebês sentam no colo dos pais.
Desafio : escreva um programa para dividir uma lista de itens em pedaços. Cada pedaço (exceto possivelmente o último) tem o mesmo tamanho , em que tamanho é definido como o número de itens que passam por uma função predicada.
Regras :
- Seu programa deve levar
- uma lista de itens
- um tamanho de pedaço inteiro positivo
- uma função predicada (pega um item e retorna verdadeiro ou falso)
- Você deve retornar a lista de entrada dividida em partes
- Cada pedaço é uma lista de itens
- No geral, os itens devem permanecer na mesma ordem, sem nenhum descartado
- O número de itens que passam o predicado em cada bloco (exceto possivelmente o último) deve corresponder ao tamanho do bloco de entrada.
- itens com falha no predicado não devem contar para esse tamanho
- Itens com falha no predicado são
- ainda incluído nos pedaços de saída
- alocado para o primeiro pedaço, no caso de um pedaço estar "cheio", mas os próximos itens falharem no predicado
- portanto, o pedaço final pode não consistir apenas em itens que falham no predicado
- O pedaço final pode ter tamanho menor que o tamanho do pedaço, porque todos os itens foram contabilizados.
Exemplos não exaustivos:
O exemplo mais simples é considerar 1s e 0s, onde está a função predicada x ==> x > 0. Nesse caso, o sumde cada pedaço deve corresponder ao tamanho do pedaço.
- itens :,
[]tamanho2:, predicado:x > 0->[]ou[[]] - itens :,
[0, 0, 0, 0, 0, 0]tamanho2:, predicado:x > 0->[[0, 0, 0, 0, 0, 0]] - itens :,
[0, 1, 1, 0]tamanho2:, predicado:x > 0->[[0, 1, 1, 0]] - itens :,
[0, 1, 1, 0, 1, 0, 0]tamanho2:, predicado:x > 0->[[0, 1, 1, 0], [1, 0, 0]] - itens :,
[0, 1, 0, 0, 1, 0, 1, 1, 0]tamanho2:, predicado:x > 0->[[0, 1, 0, 0, 1, 0], [1, 1, 0]]
E vamos terminar com os passageiros do avião, onde os bebês se sentam no exemplo do colo dos pais . Apara adulto, bpara bebê, a fila do avião tem 3assentos largos, o adulto sempre é listado antes do bebê:
- itens :,
[A, b, A, b, A, A, A, b, A, b, A, A, b]tamanho3:, predicado:x => x == A->[[A, b, A, b, A], [A, A, b, A, b], [A, A, b]]