Motivazione : a volte alcuni elementi di un elenco non contano ai fini del totale. Ad esempio, contando i passeggeri dell'aereo in file, dove i bambini si siedono sulle ginocchia di un genitore.
Sfida : scrivere un programma per dividere un elenco di elementi in blocchi. Ogni blocco (tranne forse l'ultimo) ha le stesse dimensioni , dove la dimensione è definita come il numero di elementi che passano una funzione predicata.
Regole :
- Il tuo programma deve prendere
- un elenco di elementi
- una dimensione di pezzo intero positiva
- una funzione predicato (accetta un elemento e restituisce vero o falso)
- È necessario restituire l'elenco di input suddiviso in blocchi
- Ogni blocco è un elenco di elementi
- Complessivamente, gli articoli devono rimanere nello stesso ordine, senza essere scartati
- Il numero di elementi che passano predicato in ciascun blocco (tranne forse l'ultimo) deve corrispondere alla dimensione del blocco di input.
- gli articoli che non superano il predicato non devono essere considerati per questa dimensione
- Gli elementi che non riescono nel predicato sono
- ancora incluso nei blocchi di output
- allocato al primo blocco, nel caso in cui un blocco sia "pieno" ma gli elementi successivi sono quelli che falliscono il predicato
- pertanto il blocco finale potrebbe non essere costituito esclusivamente da elementi che non riescono nel predicato
- Il blocco finale può avere dimensioni inferiori a quelle del blocco perché tutti gli articoli sono stati contabilizzati.
Esempi non esaustivi:
L'esempio più semplice è quello di considerare 1s e 0s, dove la funzione predicato è x ==> x > 0. In questo caso, il valore sumdi ciascun blocco deve corrispondere alla dimensione del blocco.
- articoli :,
[]dimensione2:, predicato:x > 0-> o[]oppure[[]] - articoli :,
[0, 0, 0, 0, 0, 0]dimensioni2:, predicato:x > 0->[[0, 0, 0, 0, 0, 0]] - articoli :,
[0, 1, 1, 0]dimensioni2:, predicato:x > 0->[[0, 1, 1, 0]] - articoli :,
[0, 1, 1, 0, 1, 0, 0]dimensioni2:, predicato:x > 0->[[0, 1, 1, 0], [1, 0, 0]] - articoli :,
[0, 1, 0, 0, 1, 0, 1, 1, 0]dimensioni2:, predicato:x > 0->[[0, 1, 0, 0, 1, 0], [1, 1, 0]]
E finiamo con i passeggeri dell'aereo in cui i bambini siedono sull'esempio del grembo di un genitore . Aper gli adulti, bper i bambini, la fila dell'aereo è 3larga seggi, gli adulti sono sempre elencati prima del loro bambino:
- articoli :,
[A, b, A, b, A, A, A, b, A, b, A, A, b]dimensioni3:, predicato:x => x == A->[[A, b, A, b, A], [A, A, b, A, b], [A, A, b]]