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 1
s i 0
s, gdzie jest funkcja predykatu x ==> x > 0
. W takim przypadku sum
każ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. A
dla dorosłych, b
dla dziecka, rząd rzędów samolotów jest 3
szeroki, 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]]