Kurzusok
/
Factor
Factor
/
Feladatok
/
Belga tehervagonok
Belga tehervagonok

Belga tehervagonok

Tanulófeladat

Bevezetés

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ő darabok

group ( 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óablak

clump ( 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 ad

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

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

Mikor melyiket használd

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

Utasítások

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.

1. Kapcsolj kocsikat vonatokba

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

2. Vess egy pillantást a kapcsolókra

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

3. Bontsd szét a láncot az elágazásoknál

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

4. Vond össze az azonos rakományokat

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" } }
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Factor Exercism

Készen állsz elkezdeni a(z) Belga tehervagonok feladatot?

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.