Track
/
Factor
Factor
/
Esercizi
/
Carri merci belgi
Carri merci belgi

Carri merci belgi

Esercizio di apprendimento

Introduzione

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 predicato

split-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 adiacente

monotonic-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.

Quando usare quale

  • 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.

Istruzioni

È 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.

1. Accoppia i carri in treni

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" } }

2. Dai un'occhiata agli accoppiamenti

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" } }

3. Dividi la catena agli scambi

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" } }

4. Accorpa il carico identico

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" } }
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Factor Exercism

Vuoi iniziare Carri merci belgi?

Iscriviti a Exercism per imparare e padroneggiare Factor con 47 concetti163 esercizi e il mentoring di persone reali, tutto gratis.