Néha egy sorozatot nem elemenként, hanem darabok sorozataként kell szemlélned. A grouping, a splitting és a splitting.monotonic szókészletek négyféle módot kínálnak erre.
group – n méretű, nem átfedő darabokgroup ( seq n -- groups )
USING: grouping ;
{ 1 2 3 4 5 6 7 } 3 group .
! => { { 1 2 3 } { 4 5 6 } { 7 } }
Ha a sorozat hossza nem n többszöröse, az utolsó csoport rövidebb lesz n-nél.
clump – n méretű, átfedő csúszóablakclump ( seq n -- clumps )
USING: grouping ;
{ 1 2 3 4 5 } 2 clump .
! => { { 1 2 } { 2 3 } { 3 4 } { 4 5 } }
Ha a sorozat rövidebb n-nél, az eredmény üres.
split-when – felbontás ott, ahol a predikátum igazat adsplit-when ( seq quot: ( elt -- ? ) -- pieces )
USING: splitting ;
{ 1 2 0 3 4 0 5 } [ zero? ] split-when .
! => { { 1 2 } { 3 4 } { 5 } }
Minden elemre külön lefut a predikátum; azok az elemek, amelyekre igazat ad, a töréspontok, és nem kerülnek bele az eredménybe.
monotonic-split – futamok felbontása ott, ahol a szomszédos párok vizsgálata elbukikmonotonic-split ( seq quot: ( a b -- ? ) -- pieces )
USING: splitting.monotonic ;
{ 1 1 2 2 2 3 } [ = ] monotonic-split .
! => { { 1 1 } { 2 2 2 } { 3 } }
A predikátum mindig szomszédos párokra fut le. Amíg igazat ad, addig folytatódik a futam; amikor f-et ad vissza, új darab kezdődik. A [ = ] predikátummal az egyenlő elemek futamait kapod, a [ <= ] predikátummal a nem csökkenő futamokat, és így tovább.
group/clump: ismered a kívánt méretet.split-when: tudod, hogy néz ki egy töréselem.monotonic-split: tudod, mitől tartozik még össze két szomszédos elem.Megint mozgalmas éjszaka az antwerpeni rendező pályaudvaron. Te vagy a szolgálatban lévő forgalmista: a beérkező teherkocsikat kimenő vonatokba kell újracsoportosítani, a kapcsolókat átvizsgálni, az útvonalakat az elágazásoknál szétválasztani, az azonos rakományokat pedig a számlázáshoz összevonni.
Minden kocsi egy string, amely megmondja, mit szállít:
"coal", "timber", "crates" stb.
Definiáld a couple szót úgy, hogy egy kocsikból álló tömböt és egy
n hosszúságot vegyen át, és n kocsiból álló, nem átfedő vonatokat
adjon vissza. Az utolsó vonat rövidebb is lehet, ha a darabszám nem
osztható egyenlően.
{ "coal" "coal" "coke" "ore" "ore" "timber" "timber" } 3 couple .
! => { { "coal" "coal" "coke" } { "ore" "ore" "timber" } { "timber" } }
Definiáld a peek-couplings szót úgy, hogy egy kocsikból álló tömböt
vegyen át, és minden szomszédos párt adjon vissza, hogy az ellenőr
meg tudja vizsgálni az egyes kapcsolókat.
{ "coal" "ore" "timber" "crates" } peek-couplings .
! => { { "coal" "ore" } { "ore" "timber" } { "timber" "crates" } }
Definiáld a split-at-junctions szót úgy, hogy egy kocsikból álló
tömböt és egy junctions tömböt vegyen át (ezek azok a kocsik,
amelyek töréspontot jelölnek), és adja vissza az elágazást jelölő
kocsik közötti szakaszokat. Magukat az elágazást jelölő kocsikat nem
tartja meg.
{ "coal" "coal" "switch" "ore" "switch" "timber" }
{ "switch" } split-at-junctions .
! => { { "coal" "coal" } { "ore" } { "timber" } }
Definiáld a coalesce-cargo szót úgy, hogy egy kocsikból álló tömböt
vegyen át, és az ugyanazt a rakományt szállító egymást követő
kocsikat sorozatokba csoportosítsa.
{ "coal" "coal" "ore" "ore" "ore" "timber" "coal" } coalesce-cargo .
! => { { "coal" "coal" } { "ore" "ore" "ore" } { "timber" } { "coal" } }
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Factor nyelvet 47 fogalom163 feladat segítségével, valódi emberi mentorálással, mindez ingyen.