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 1
s e 0
s, dove la funzione predicato è x ==> x > 0
. In questo caso, il valore sum
di 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 . A
per gli adulti, b
per i bambini, la fila dell'aereo è 3
larga 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]]