Motivation : Parfois, certains éléments d'une liste ne comptent pas dans vos totaux. Par exemple, compter les passagers d'un avion en rangées, où les bébés sont assis sur les genoux d'un parent.
Défi : écrire un programme pour diviser une liste d'articles en morceaux. Chaque bloc (sauf éventuellement le dernier) a la même taille , où la taille est définie comme le nombre d'éléments passant une fonction de prédicat.
Règles :
- Votre programme doit prendre
- une liste d'articles
- une taille de bloc entière positive
- une fonction de prédicat (prend un élément et renvoie vrai ou faux)
- Vous devez renvoyer la liste d'entrée divisée en morceaux
- Chaque morceau est une liste d'articles
- Globalement, les articles doivent rester dans le même ordre, aucun n'est ignoré
- Le nombre d'éléments passant le prédicat dans chaque bloc (sauf éventuellement le dernier) doit correspondre à la taille du bloc d'entrée.
- les éléments qui échouent au prédicat ne doivent pas compter dans cette taille
- Les éléments qui échouent au prédicat sont
- toujours inclus dans les morceaux de sortie
- alloué au premier morceau, dans le cas où un morceau est "plein" mais les éléments suivants sont ceux qui échouent au prédicat
- ainsi le dernier morceau peut ne pas être composé uniquement d'éléments ne respectant pas le prédicat
- Le morceau final peut être de taille inférieure à la taille du morceau car tous les articles ont été pris en compte.
Exemples non exhaustifs:
L'exemple le plus simple consiste à considérer 1
s et 0
s, où se trouve la fonction de prédicat x ==> x > 0
. Dans ce cas, le sum
de chaque bloc doit correspondre à la taille du bloc.
- éléments:,
[]
taille2
:, prédicat:x > 0
->[]
ou[[]]
- articles:,
[0, 0, 0, 0, 0, 0]
taille2
:, prédicat:x > 0
->[[0, 0, 0, 0, 0, 0]]
- articles:,
[0, 1, 1, 0]
taille2
:, prédicat:x > 0
->[[0, 1, 1, 0]]
- articles:,
[0, 1, 1, 0, 1, 0, 0]
taille2
:, prédicat:x > 0
->[[0, 1, 1, 0], [1, 0, 0]]
- articles:,
[0, 1, 0, 0, 1, 0, 1, 1, 0]
taille2
:, prédicat:x > 0
->[[0, 1, 0, 0, 1, 0], [1, 1, 0]]
Et terminons avec les passagers de l' avion où les bébés sont assis sur les genoux d'un parent . A
pour adulte, b
pour bébé, la rangée de l'avion est 3
large, les adultes sont toujours répertoriés avant leur bébé:
- articles:,
[A, b, A, b, A, A, A, b, A, b, A, A, b]
taille3
:, prédicat:x => x == A
->[[A, b, A, b, A], [A, A, b, A, b], [A, A, b]]