Kurzusok
/
Factor
Factor
/
Feladatok
/
Zászlóbőség
Zászlóbőség

Zászlóbőség

Tanulófeladat

Bevezetés

Amikor n értékből álló sorra van szükséged, ahol mindegyik a saját pozíciójától függ, a Factor <iota> és map együtt oldja meg a feladatot, anélkül hogy ciklusszámlálót kellene írnod.

A <iota> és a map

A <iota> (a sequences szótárban) egy nemnegatív egész számot, n-t vesz át, és a 0, 1, …, n-1 egészek virtuális sorozatát adja vissza. A map ezután végigjárja, és minden elemre alkalmazza a quotationt:

USING: math sequences ;

5 <iota> [ 2 * ] map .   ! => { 0 2 4 6 8 }

A quotation egyetlen egész számot kap, a pozíciót (az indexet), és a pozícióhoz tartozó értéket hagyja a stacken.

Iterálás és ismétlés darabszám szerint

Amikor csak az egyes pozíciók bejárásának mellékhatásaira van szükséged, nem pedig egy új sorozatra, az each-integer (a math szótárban) végigfuttat egy quotationt a 0, 1, …, n-1 értékeken:

each-integer ( n quot: ( i -- ) -- )

A replicate (a sequences szótárban) n-szer hív meg egy quotationt, és összegyűjti az eredményeket, figyelmen kívül hagyva az indexet. Kényelmes n független érték előállításához:

replicate ( n quot: ( -- elt ) -- seq )
USING: sequences ;

3 [ { 0 0 } ] replicate .   ! => { { 0 0 } { 0 0 } { 0 0 } }

Korlátos tartományok

Amikor az indextartomány nem 0-tól kezdődik, vagy mindkét végén inkluzív szeretnéd, a ranges szótár zárójeles jelöléssel írt literálokat kínál. A szögletes zárójel tartalmazza a végpontot, a kerek zárójel nem.

[a..b]    ! a, a+1, …, b      (inclusive)
[a..b)    ! a, a+1, …, b-1    (half-open at the top)
USING: math ranges sequences ;

3 7 [a..b] [ 2 * ] map .   ! => { 6 8 10 12 14 }
3 7 [a..b) [ 2 * ] map .   ! => { 6 8 10 12 }

Néhány gyakori, egyargumentumos rövidítés:

[1..b]    ! 1, 2, …, b        (same as 1 b [a..b])
[1..b)    ! 1, 2, …, b-1      (same as 1 b [a..b))
[0..b)    ! 0, 1, …, b-1      (same as 0 b [a..b), and same as `b <iota>`)
6 [1..b] [ sq ] map .      ! => { 1 4 9 16 25 36 }
6 [1..b) [ sq ] map .      ! => { 1 4 9 16 25 }
4 [0..b) [ 1 + ] map .     ! => { 1 2 3 4 }

A <iota> a leggyakoribb forma; a [a..b] és társai akkor a megfelelő eszközök, amikor a tartomány nem 0-tól indul, vagy inkluzív felső korlátra van szükség.

Nyitott alsó korlátok és esetleg üres tartományok

A szögletes zárójel tartalmazza a végpontot, a kerek zárójel kizárja azt. Ugyanez a trükk a bal oldalon a (a..b] és (a..b) jelölést adja:

(a..b]    ! a+1, …, b              (lower open, upper inclusive)
(a..b)    ! a+1, …, b-1            (both open)

A 0 n (a..b] { 1 … n }-t ad n > 0 esetén, és { }-t n = 0 esetén. Ez a természetes alak, amikor minden pozitív egészen n-ig bezárólag iterálsz.

Csökkenő tartományok

Mind a négy zárójeles forma, a [a..b], [a..b), (a..b] és (a..b), lefelé számol, amikor a > b, nem pedig üres eredmény felé halad:

USING: ranges sequences ;

5 1 [a..b] >array .   ! => { 5 4 3 2 1 }
1 0 [a..b] >array .   ! => { 1 0 }   (not empty!)

Szöveg építése pozíció szerint

A map mindig olyan alakot ad, amit a quotation visszaad. Ha a quotation egy karakterkódot hagy a stacken, a >string (a strings szótárban) szöveggé alakítja az eredményt:

USING: math sequences strings ;

4 <iota> [ 2 * CHAR: A + ] map >string .   ! => "ACEG"

A CHAR: A a 65 egész számmá alakul. A quotation itt megduplázza az indexet, majd hozzáadja ezt a bázist, amivel minden második nagybetűre jut. Bármilyen aritmetika, amit az indexre építesz, eldönti, melyik karakter kerül abba a pozícióba.

Választás pozíciónként

Amikor a karakter az indexre vonatkozó feltételtől függ, a választást a quotation belsejében végezd el:

USING: kernel math sequences strings ;

5 <iota> [ 3 < [ CHAR: a ] [ CHAR: b ] if ] map >string .
! => "aaabb"

Az első három pozíció az i 3 < kifejezést t-ként értékeli ki, így a-t kapnak; a többi b-t. Ugyanez az alak, a [ <test> [ <yes> ] [ <no> ] if ], lefedi a paritásvizsgálatokat az even? / odd? (a math szótárban) szavakkal, valamint a „minden k-adik pozíció” vizsgálatokat a mod és a zero? szavakkal.

Utasítások

Egy bulirobot zászlófüzért fűz fel a nagy mulatságra. A zászlófüzér minden sora n kis zászlóból álló vízszintes sor, és minden zászló karakterét az dönti el, hogy hol ül a zászló a sorban, balról 0-tól kezdve számolva. Segíts a robotnak összeállítani az alábbi mintákat.

1. Ábécé-füzér

Definiáld az alphabet-bunting szót úgy, hogy levegyen a veremből egy nemnegatív egész n számot, és visszaadja az ábécé első n kisbetűjéből álló stringet.

5 alphabet-bunting .
! => "abcde"

0 alphabet-bunting .
! => ""

Felteheted, hogy n legfeljebb 26.

2. Számláló füzér

Definiáld a counting-bunting szót úgy, hogy vegyen egy n értéket, és visszaadjon egy n számjegyből álló stringet, amelyben az i pozícióban lévő zászló i mod 10-et mutat.

12 counting-bunting .
! => "012345678901"

3. Csíkos füzér

Definiáld a stripe-bunting szót úgy, hogy két karakter között váltakozzon: a páros pozíciók *-ot, a páratlanok --t kapnak.

6 stripe-bunting .
! => "*-*-*-"

1 stripe-bunting .
! => "*"

4. Jelölő füzér

Minden ötödik zászló egy különleges jelölő. Definiáld a marker-bunting szót úgy, hogy a 0, 5, 10, … pozíciók |-t kapjanak, a többi pedig .-ot.

11 marker-bunting .
! => "|....|....|"

5. Völgyi füzér

A robot egy rögzített méretű, 10 zászlóból álló füzért akaszt fel, amely a közepénél egy kampóra kerül. A -5 pozícióban lévő bal szélső zászlótól 5-ig (de azt már nem beleértve) minden zászló karaktere a középponttól mért távolság, számjegyként leírva.

Definiáld a valley-bunting szót (bemenet nélkül), hogy adja vissza ezt a rögzített stringet.

valley-bunting .
! => "5432101234"
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Factor Exercism

Készen állsz elkezdeni a(z) Zászlóbőség 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.