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 1
s e 0
s, onde está a função predicada x ==> x > 0
. Nesse caso, o sum
de 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 . A
para adulto, b
para bebê, a fila do avião tem 3
assentos 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]]