Motywacja : Czasami niektóre elementy na liście nie liczą się do twoich sum. Na przykład liczenie pasażerów samolotów w rzędach, gdzie dzieci siedzą na kolanach rodzica.
Wyzwanie : napisz program, który podzieli listę przedmiotów na części. Każda porcja (z wyjątkiem ewentualnie ostatniej) ma ten sam rozmiar , przy czym rozmiar jest definiowany jako liczba elementów przechodzących przez funkcję predykatu.
Zasady :
- Twój program musi zająć
- lista przedmiotów
- dodatni całkowity rozmiar porcji
- funkcja predykatu (pobiera element i zwraca wartość true lub false)
- Musisz zwrócić listę wejściową podzieloną na części
- Każda porcja to lista przedmiotów
- Ogólnie rzecz biorąc, przedmioty muszą pozostać w tej samej kolejności, bez odrzucenia
- Liczba elementów przekazujących predykat w każdej porcji (z wyjątkiem ewentualnie ostatniej) powinna być zgodna z rozmiarem wejściowej porcji.
- elementy, które nie przeszły orzeczenia, nie powinny się liczyć do tego rozmiaru
- Elementy, które nie spełniają predykatu, to
- nadal zawarte w porcjach wyjściowych
- przydzielone do najwcześniejszego fragmentu, w przypadku, gdy fragment jest „pełny”, ale kolejne elementy nie spełniają predykatu
- tak więc końcowa porcja może nie składać się wyłącznie z elementów, które nie spełniają predykatu
- Końcowy fragment może mieć rozmiar mniejszy niż wielkość porcji, ponieważ wszystkie elementy zostały uwzględnione.
Niewyczerpujące przykłady:
Najprostszym przykładem jest rozważenie 1s i 0s, gdzie jest funkcja predykatu x ==> x > 0. W takim przypadku sumkażda porcja musi być zgodna z rozmiarem porcji.
- elementy :,
[]rozmiar2:, predykat:x > 0-> albo[]albo[[]] - elementy :,
[0, 0, 0, 0, 0, 0]rozmiar2:, predykat:x > 0->[[0, 0, 0, 0, 0, 0]] - elementy :,
[0, 1, 1, 0]rozmiar2:, predykat:x > 0->[[0, 1, 1, 0]] - elementy :,
[0, 1, 1, 0, 1, 0, 0]rozmiar2:, predykat:x > 0->[[0, 1, 1, 0], [1, 0, 0]] - elementy :,
[0, 1, 0, 0, 1, 0, 1, 1, 0]rozmiar2:, predykat:x > 0->[[0, 1, 0, 0, 1, 0], [1, 1, 0]]
I skończmy z pasażerów samolotu, gdzie dzieci siedzą na kolanach rodzica np. Adla dorosłych, bdla dziecka, rząd rzędów samolotów jest 3szeroki, osoby dorosłe są zawsze wymienione przed dzieckiem:
- elementy :,
[A, b, A, b, A, A, A, b, A, b, A, A, b]rozmiar3:, predykat:x => x == A->[[A, b, A, b, A], [A, A, b, A, b], [A, A, b]]