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]]
źródło
Odpowiedzi:
Galaretka , 10 bajtów
Pełny program przyjmujący monadyczną funkcję czarnej skrzynki jako pierwszy opcjonalny argument, listę jako drugi opcjonalny argument, a wielkość porcji jako trzeci opcjonalny argument, który wypisuje reprezentację wynikową listy list w Pythonie (aby uniknąć niejawnego zniszczenia przez Jelly listy zawierające znaki).
Wypróbuj online! (zwróć uwagę, że lista znaków jest przekazywana do programu Jelly, formatując go jako ciąg cytowany w języku Python)
W jaki sposób?
źródło
Brachylog , 37 bajtów
Wypróbuj online!
Byłem mile zaskoczony, gdy stwierdziłem, że to - w zasadzie powtórzenie pytania - z powodzeniem kończy się i daje prawidłowy wynik.
Zakłada, że predykat jest obecny jako predykat 2 poniżej tego kodu. Wysyła listę list („fragmentów”) lub
false
dla pustych danych wejściowych.Wyjaśnienie:
źródło
Apl (Dyalog Unicode)
1716 bajtów (SBCS)Dzięki Adámowi za uratowanie mnie 1 bajt.
Wypróbuj online! w celu wyjaśnienia pozostawię 17-bajtowe rozwiązanie.
⍺⍺¨⍵
stosuje predykat do listy zwracając wektor boolowski+\
generuje bieżącą sumę1⌈
zastępuje wiodące0
s1
s⌈⍺÷⍨
dzieli każdy element przez wielkość porcji i zaokrągla w⍵⊆⍨
ten sposób oryginalny wektorźródło
w⊆⍨⌈⎕÷⍨1⌈+\⎕¨w←⎕
Czysty ,
9692 bajtówUżywa nazwanej funkcji
f :: a -> Bool
dozwolonej zgodnie z meta-konsensusem.Wypróbuj online!
Rozszerzony (z domyślnym podświetleniem, aby pojawiały się komentarze):
źródło
Java 10,
207186159148 bajtówJava zdecydowanie nie jest właściwym językiem dla tego wyzwania (lub jakiegokolwiek innego wyzwania dla kodegolfa ..)
-21 bajtów dzięki @OOBalance
Wypróbuj online.
Wyjaśnienie:
Format wejściowy czarnej skrzynki:
Zakłada, że nazwana funkcja
boolean f(Object i)
jest obecna, co jest dozwolone zgodnie z tą meta odpowiedzią .Mam klasę abstrakcyjną
Test
zawierającą funkcję domyślnąf(i)
, a także powyższą lambda:W przypadkach testowych nadpisuję tę funkcję
f
. Na przykład ostatni przypadek testowy nazywa się tak:źródło
(or any codegolf-challenge of course..)
” ehh, nie wiem, pokonałeś moje czyste odpowiedzi w co najmniej kilku przypadkach. W każdym razie zawsze czekam na twoje odpowiedzi.Arrays.copyOfRange
!.sublist
. Poza tym twoja funkcjonalność pozostaje taka sama, ale oszczędza wiele bajtów i usuwa import. (A teraz działa również w przypadku testowym ze znakami zamiast liczb całkowitych.)R , 58 bajtów
Wypróbuj online!
źródło
C (gcc) ,
7066 bajtówUżywam struktury do odnotowania początku listy podrzędnej, ponieważ C nie wie o takich rzeczach.
Dzięki pułapkowi cat za sugestie.
Wypróbuj online!
źródło
Haskell, 72 bajty
Wypróbuj online!
źródło
MATL, 19 bajtów
Na podstawie doskonałej odpowiedzi APL jslip .
MATL tak naprawdę nie ma funkcji zdefiniowanych przez użytkownika, ale ma sposób wywoływania środowiska, w którym działa (MATLAB / Octave), więc wykorzystuje to dla funkcji predykatu. Wykorzystanie byłoby coś jak to , ale funkcja jest wyłączona ze względów bezpieczeństwa w Internecie, więc tutaj jest wersja, która wykorzystuje Hardcoded
isodd
funkcję predykatu zamiast: Wypróbuj Mátl Online .źródło
JavaScript (ES6), 69 bajtów
Zaoszczędź 3 bajty dzięki @tsh
Pobiera dane wejściowe w składni curry
(size)(predicate)(array)
.Wypróbuj online!
źródło
s=>p=>g=a=>a.every(x=>p(x)?k--:++j,j=k=s)?[a]:[a.splice(0,j),...g(a)]
Rubinowy , 57 bajtów
Wypróbuj online!
Anonimowa lambda akceptuje tablicę wejściową
a
, wielkość porcjin
i predykatg
. Utrzymuje licznikc
elementów pasujących do predykatu i grupuje elementy według liczby już zużytych porcji. Niestety, początkowa wartość -1 / n nie zaokrągla w górę do 0, więc musimy wydać kilka bajtów, aby to naprawić.źródło
R , 100 bajtów
Wypróbuj online!
porośnięty outgolfem przez digEmAll
źródło
Python 2 , 92 bajty
Wypróbuj online!
źródło
JavaScript (Node.js) , 90 bajtów
Wypróbuj online!
Wywołaj jako
F(2, x => x > 0)([0, 1, 1, 0])
źródło
Mathematica, 82 bajty
Nie golfowany:
l
to lista wejściowa;s
to wielkość porcji;p
to nienazwana / anonimowa / czysta / lambda funkcja zwracająca wartość prawda / fałsz działająca na elementach listy.Last@Reap[...]
zwraca listę list każdego elementu, który byłSow
-n wewnątrz...
. Są one pogrupowane w podlisty według drugiego argumentu,e~Sow~t
który jest skrótemSow[e, t]
.Musiałem zainicjować liczniki do -1, aby obsłużyć porcję o wielkości 1, w przeciwnym razie musiałbym sprawdzić
Mod[i, s]
(i~Mod~s
) równą 1, co nigdy nie mogłoby się zdarzyć.Reszta kodu jest wyjaśniona w nielepszonym bloku.
źródło