A volte hai bisogno di vedere una sequenza come una serie di pezzi anziché
elemento per elemento. I vocabolari grouping,
splitting e splitting.monotonic ti
danno quattro modi per farlo.
group: blocchi disgiunti di dimensione n
group ( seq n -- groups )
USING: grouping ;
{ 1 2 3 4 5 6 7 } 3 group .
! => { { 1 2 3 } { 4 5 6 } { 7 } }
Se la lunghezza della sequenza non è un multiplo di n, l'ultimo gruppo è più corto di n.
clump: finestra scorrevole sovrapposta di dimensione n
clump ( seq n -- clumps )
USING: grouping ;
{ 1 2 3 4 5 } 2 clump .
! => { { 1 2 } { 2 3 } { 3 4 } { 4 5 } }
Se la sequenza è più corta di n, il risultato è vuoto.
split-when: spezza ovunque scatti un predicatosplit-when ( seq quot: ( elt -- ? ) -- pieces )
USING: splitting ;
{ 1 2 0 3 4 0 5 } [ zero? ] split-when .
! => { { 1 2 } { 3 4 } { 5 } }
Ogni elemento riceve la propria chiamata al predicato; gli elementi veri sono i punti di interruzione e non vengono mantenuti nel risultato.
monotonic-split: spezza le serie dove fallisce un controllo sulla coppia adiacentemonotonic-split ( seq quot: ( a b -- ? ) -- pieces )
USING: splitting.monotonic ;
{ 1 1 2 2 2 3 } [ = ] monotonic-split .
! => { { 1 1 } { 2 2 2 } { 3 } }
Il predicato lavora su coppie adiacenti. Finché restituisce un valore vero,
la serie continua; quando restituisce f, inizia un nuovo pezzo. Con [ = ]
ottieni serie di elementi uguali; con [ <= ] ottieni serie non decrescenti;
e così via.
group/clump: conosci la dimensione che vuoi.split-when: sai che aspetto ha un elemento di interruzione.monotonic-split: sai cosa fa sì che due elementi adiacenti
appartengano ancora insieme.È un'altra notte di gran lavoro allo scalo di smistamento di Anversa. Sei tu il responsabile dello smistamento di turno: i carri merci in arrivo vanno raggruppati in treni in partenza, gli accoppiamenti ispezionati, i percorsi divisi agli scambi e i carichi identici accorpati per la fatturazione.
Ogni carro è una stringa che indica ciò che trasporta: "coal", "timber", "crates", ecc.
Definisci couple in modo che prenda un array di carri e una lunghezza n, e restituisca treni non sovrapposti di n carri ciascuno. L'ultimo treno può essere più corto se il conteggio non si divide in parti uguali.
{ "coal" "coal" "coke" "ore" "ore" "timber" "timber" } 3 couple .
! => { { "coal" "coal" "coke" } { "ore" "ore" "timber" } { "timber" } }
Definisci peek-couplings in modo che prenda un array di carri e restituisca ogni coppia adiacente, così l'ispettore può esaminare ogni accoppiamento.
{ "coal" "ore" "timber" "crates" } peek-couplings .
! => { { "coal" "ore" } { "ore" "timber" } { "timber" "crates" } }
Definisci split-at-junctions in modo che prenda un array di carri e un array di junctions (carri che segnano un punto di separazione), e restituisca i tratti tra i carri di scambio. I carri di scambio stessi non vengono conservati.
{ "coal" "coal" "switch" "ore" "switch" "timber" }
{ "switch" } split-at-junctions .
! => { { "coal" "coal" } { "ore" } { "timber" } }
Definisci coalesce-cargo in modo che prenda un array di carri e raggruppi in sequenze i carri consecutivi che trasportano lo stesso carico.
{ "coal" "coal" "ore" "ore" "ore" "timber" "coal" } coalesce-cargo .
! => { { "coal" "coal" } { "ore" "ore" "ore" } { "timber" } { "coal" } }
Iscriviti a Exercism per imparare e padroneggiare Factor con 47 concetti163 esercizi e il mentoring di persone reali, tutto gratis.