Manchmal musst du eine Sequenz als eine Reihe von Stücken betrachten statt Element für Element. Die Vokabulare grouping, splitting und splitting.monotonic geben dir vier Möglichkeiten dafür.
group: disjunkte Stücke der Größe n
group ( seq n -- groups )
USING: grouping ;
{ 1 2 3 4 5 6 7 } 3 group .
! => { { 1 2 3 } { 4 5 6 } { 7 } }
Wenn die Länge der Sequenz kein Vielfaches von n ist, ist die letzte Gruppe kürzer als n.
clump: überlappendes, gleitendes Fenster der Größe n
clump ( seq n -- clumps )
USING: grouping ;
{ 1 2 3 4 5 } 2 clump .
! => { { 1 2 } { 2 3 } { 3 4 } { 4 5 } }
Ist die Sequenz kürzer als n, ist das Ergebnis leer.
split-when: aufteilen, wo immer ein Prädikat zutrifftsplit-when ( seq quot: ( elt -- ? ) -- pieces )
USING: splitting ;
{ 1 2 0 3 4 0 5 } [ zero? ] split-when .
! => { { 1 2 } { 3 4 } { 5 } }
Jedes Element bekommt seinen eigenen Aufruf des Prädikats. Elemente, für die es einen wahren Wert liefert, sind die Bruchstellen und werden nicht ins Ergebnis übernommen.
monotonic-split: Läufe trennen, wo eine Prüfung benachbarter Paare fehlschlägtmonotonic-split ( seq quot: ( a b -- ? ) -- pieces )
USING: splitting.monotonic ;
{ 1 1 2 2 2 3 } [ = ] monotonic-split .
! => { { 1 1 } { 2 2 2 } { 3 } }
Das Prädikat wird auf benachbarte Paare angewendet. Solange es einen wahren Wert zurückgibt, läuft der aktuelle Lauf weiter; sobald es f zurückgibt, beginnt ein neues Stück. Mit [ = ] bekommst du Läufe aus gleichen Elementen, mit [ <= ] nicht absteigende Läufe und so weiter.
group/clump: du kennst die Größe, die du haben willst.split-when: du weißt, wie ein Bruchelement aussieht.monotonic-split: du weißt, was zwei benachbarte Elemente weiterhin zusammengehören lässt.Es ist wieder eine geschäftige Nacht im Rangierbahnhof von Antwerpen. Du bist der diensthabende Disponent: Ankommende Güterwagen müssen zu ausgehenden Zügen umgruppiert, Kupplungen überprüft, Strecken an den Weichen getrennt und identische Ladungen für die Abrechnung zusammengefasst werden.
Jeder Wagen ist ein String, der angibt, was er geladen hat: "coal", "timber", "crates" usw.
Definiere couple so, dass es ein Array von Wagen und eine Länge n entgegennimmt und nicht überlappende Züge aus jeweils n Wagen zurückgibt. Der letzte Zug darf kürzer sein, wenn sich die Anzahl nicht gleichmäßig aufteilen lässt.
{ "coal" "coal" "coke" "ore" "ore" "timber" "timber" } 3 couple .
! => { { "coal" "coal" "coke" } { "ore" "ore" "timber" } { "timber" } }
Definiere peek-couplings so, dass es ein Array von Wagen entgegennimmt und jedes benachbarte Paar zurückgibt, damit der Prüfer jede Kupplung untersuchen kann.
{ "coal" "ore" "timber" "crates" } peek-couplings .
! => { { "coal" "ore" } { "ore" "timber" } { "timber" "crates" } }
Definiere split-at-junctions so, dass es ein Array von Wagen und ein Array mit junctions (Wagen, die eine Trennstelle markieren) entgegennimmt und die Abschnitte zwischen den Weichenwagen zurückgibt. Die Weichenwagen selbst werden nicht behalten.
{ "coal" "coal" "switch" "ore" "switch" "timber" }
{ "switch" } split-at-junctions .
! => { { "coal" "coal" } { "ore" } { "timber" } }
Definiere coalesce-cargo so, dass es ein Array von Wagen entgegennimmt und aufeinanderfolgende Wagen mit derselben Ladung zu Gruppen zusammenfasst.
{ "coal" "coal" "ore" "ore" "ore" "timber" "coal" } coalesce-cargo .
! => { { "coal" "coal" } { "ore" "ore" "ore" } { "timber" } { "coal" } }
Melde dich bei Exercism an, um Factor mit 47 Konzepte163 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.