Motivation : Manchmal zählen bestimmte Elemente in einer Liste nicht zu Ihren Gesamtsummen. Zählen Sie beispielsweise Fluggäste in Reihen, in denen Babys auf dem Schoß eines Elternteils sitzen.
Herausforderung : Schreiben Sie ein Programm, um eine Liste von Elementen in Blöcke aufzuteilen. Jeder Block (außer möglicherweise der letzte) hat dieselbe Größe , wobei die Größe als die Anzahl der Elemente definiert ist, die eine Prädikatfunktion bestehen.
Regeln :
- Ihr Programm muss dauern
- eine Liste von Elementen
- eine positive Ganzzahlblockgröße
- eine Prädikatfunktion (nimmt ein Element und gibt true oder false zurück)
- Sie müssen die in Blöcke aufgeteilte Eingabeliste zurückgeben
- Jeder Chunk ist eine Liste von Elementen
- Insgesamt müssen die Artikel in der gleichen Reihenfolge bleiben, ohne dass sie verworfen werden
- Die Anzahl der Elemente, die das Prädikat in jedem Block (außer möglicherweise dem letzten) übergeben, sollte mit der Größe des Eingabeblocks übereinstimmen.
- Elemente, die das Prädikat nicht erfüllen, sollten bei dieser Größe nicht berücksichtigt werden
- Elemente, die das Prädikat nicht erfüllen, sind
- weiterhin in den Ausgabestücken enthalten
- Wird dem frühesten Chunk zugewiesen, wenn ein Chunk "voll" ist, aber die nächsten Elemente das Prädikat nicht erfüllen
- Daher besteht der letzte Block möglicherweise nicht nur aus Elementen, die das Prädikat nicht erfüllen
- Der endgültige Block hat möglicherweise eine kleinere Größe als der Block, da alle Elemente berücksichtigt wurden.
Nicht erschöpfende Beispiele:
Das einfachste Beispiel ist, 1
s und 0
s zu betrachten, in denen die Prädikatfunktion ist x ==> x > 0
. In diesem Fall sum
muss der Wert jedes Blocks mit der Blockgröße übereinstimmen.
- Elemente:,
[]
Größe2
:, Prädikat:x > 0
-> entweder[]
oder[[]]
- Elemente:,
[0, 0, 0, 0, 0, 0]
Größe2
:, Prädikat:x > 0
->[[0, 0, 0, 0, 0, 0]]
- Elemente:,
[0, 1, 1, 0]
Größe2
:, Prädikat:x > 0
->[[0, 1, 1, 0]]
- Elemente:,
[0, 1, 1, 0, 1, 0, 0]
Größe2
:, Prädikat:x > 0
->[[0, 1, 1, 0], [1, 0, 0]]
- Elemente:,
[0, 1, 0, 0, 1, 0, 1, 1, 0]
Größe2
:, Prädikat:x > 0
->[[0, 1, 0, 0, 1, 0], [1, 1, 0]]
Und lassen Sie uns mit den Flugzeugpassagieren enden, bei denen Babys auf dem Schoß eines Elternteils sitzen . A
Für Erwachsene, b
für Babys ist die 3
Sitzreihe in der Ebene breit, Erwachsene stehen immer vor ihrem Baby:
- Elemente:,
[A, b, A, b, A, A, A, b, A, b, A, A, b]
Größe3
:, Prädikat:x => x == A
->[[A, b, A, b, A], [A, A, b, A, b], [A, A, b]]
quelle
Antworten:
Gelee , 10 Bytes
Ein vollständiges Programm, das die monadische Black-Box-Funktion als erstes optionales Argument, die Liste als zweites optionales Argument und die Blockgröße als drittes optionales Argument verwendet und eine Python-Darstellung der resultierenden Liste von Listen ausgibt (um Jellys implizites Zerschlagen von zu vermeiden) Listen mit Zeichen).
Probieren Sie es online! (Beachten Sie, dass eine Liste von Zeichen an ein Jelly-Programm übergeben wird, indem es als Zeichenfolge in Python-Anführungszeichen formatiert wird.)
Wie?
quelle
Brachylog , 37 Bytes
Probieren Sie es online!
Ich war angenehm überrascht, dass dies - so ziemlich eine Wiederholung der Frage - erfolgreich beendet wurde und eine korrekte Ausgabe hervorbringt.
Angenommen, das Prädikat ist als Prädikat 2 unterhalb dieses Codes vorhanden. Gibt eine Liste von Listen ("Chunks") oder
false
eine leere Eingabe aus.Erläuterung:
quelle
Apl (Dyalog Unicode)
1716 Bytes (SBCS)Vielen Dank an Adám, der mir 1 Byte gespart hat.
Probieren Sie es online! zur Erklärung werde ich die 17-Byte-Lösung weglassen.
⍺⍺¨⍵
Wendet das Prädikat auf die Liste an, wobei ein boolescher Vektor zurückgegeben wird.+\
Generiert eine laufende Summe. Ersetzt das1⌈
führende0
s durch1
s.⌈⍺÷⍨
Dividiert jedes Element durch die Blockgröße und rundet die⍵⊆⍨
Partitionen des ursprünglichen Vektors aufquelle
w⊆⍨⌈⎕÷⍨1⌈+\⎕¨w←⎕
Sauber ,
9692 BytesVerwendet eine benannte Funktion,
f :: a -> Bool
die gemäß Metakonsens zulässig ist.Probieren Sie es online!
Erweitert (mit Standardmarkierung, damit Kommentare angezeigt werden):
quelle
Java 10,
207186159148 BytesJava ist definitiv nicht die richtige Sprache für diese Herausforderung (oder natürlich jede Codegolf-Herausforderung ..)
-21 Bytes dank @OOBalance
Probieren Sie es online aus.
Erläuterung:
Blackbox-Eingabeformat:
Nimmt an, dass eine benannte Funktion
boolean f(Object i)
vorhanden ist, die gemäß dieser Meta-Antwort zulässig ist .Ich habe eine abstrakte Klasse,
Test
die die Standardfunktionf(i)
sowie das obige Lambda enthält:Für die Testfälle überschreibe ich diese Funktion
f
. Der letzte Testfall heißt zum Beispiel so:quelle
(or any codegolf-challenge of course..)
ehh ich weiß nicht, du hast meine sauberen Antworten in mindestens einigen Fällen herausgeschlagen." Wie auch immer, ich freue mich immer auf Ihre Antworten.Arrays.copyOfRange
!.sublist
. Ihre Funktionalität bleibt ansonsten gleich, spart jedoch viele Bytes und entfernt den Import. (Und jetzt funktioniert es auch für den Testfall mit Zeichen anstelle von ganzen Zahlen.)R , 58 Bytes
Probieren Sie es online!
quelle
C (gcc) ,
7066 BytesIch benutze eine Struktur, um den Anfang einer Unterliste zu notieren, da C über solche Dinge nichts weiß.
Danke an ceilingcat für die Vorschläge.
Probieren Sie es online!
quelle
Haskell, 72 Bytes
Probieren Sie es online!
quelle
MATL, 19 Bytes
Basierend auf der ausgezeichneten APL-Antwort von jslip .
MATL hat eigentlich keine benutzerdefinierten Funktionen als solche, aber es gibt eine Möglichkeit, die Umgebung, in der es ausgeführt wird (MATLAB / Octave), aufzurufen. Daher wird diese Funktion für die Prädikatfunktion verwendet. Die Verwendung wäre ungefähr so , aber diese Funktionalität ist aus Sicherheitsgründen online deaktiviert. Hier ist eine Version, die
isodd
stattdessen eine fest codierte Prädikatfunktion verwendet: Probieren Sie es in MATL Online aus .quelle
JavaScript (ES6), 69 Byte
3 Bytes dank @tsh gespeichert
Übernimmt Eingaben in der Currying-Syntax
(size)(predicate)(array)
.Probieren Sie es online!
quelle
s=>p=>g=a=>a.every(x=>p(x)?k--:++j,j=k=s)?[a]:[a.splice(0,j),...g(a)]
Ruby , 57 Bytes
Probieren Sie es online!
Anonymer Lambda, der Eingabearray
a
, Blockgrößen
und Prädikat akzeptiertg
. Verwaltet einen Zählerc
für Elemente, die mit dem Prädikat übereinstimmen, und gruppiert Elemente nach der Anzahl der bereits verbrauchten Blöcke. Leider wird der anfängliche Wert -1 / n nicht auf 0 gerundet, daher müssen wir ein paar Bytes aufwenden, um ihn zu beheben.quelle
R , 100 Bytes
Probieren Sie es online!
von digEmAll handlich überfordert
quelle
Python 2 , 92 Bytes
Probieren Sie es online!
quelle
JavaScript (Node.js) , 90 Byte
Probieren Sie es online!
Aufrufen als
F(2, x => x > 0)([0, 1, 1, 0])
quelle
Mathematica, 82 Bytes
Ungolfed:
l
ist die Eingabeliste;s
ist Stückgröße;p
ist eine unbenannte / anonyme / reine / Lambda-Funktion, die true / false zurückgibt, wenn Elemente der Liste bearbeitet werden.Last@Reap[...]
Gibt eine Liste mit Listen aller Elemente zurück, in denenSow
-n enthalten war...
. Sie werden in Unterlisten gruppiert, deren zweites Argumente~Sow~t
eine Abkürzung istSow[e, t]
.Ich musste Zähler auf -1 initialisieren, um eine Blockgröße von 1 zu verarbeiten, sonst müsste ich check
Mod[i, s]
(i~Mod~s
) gleich 1 setzen, was niemals passieren könnte.Der Rest des Codes wird im ungolfed Block erklärt.
quelle