Kurzusok
/
Factor
Factor
/
Feladatok
/
Kerti madárszámlálás
Kerti madárszámlálás

Kerti madárszámlálás

Tanulófeladat

Bevezetés

A legtöbbször a Factor az iterációt olyan kombinátorokkal oldja meg, mint az each, a map és a count. Néha viszont a legtisztább módja egy számítás leírásának a rekurzió: egy szó, ami önmagát hívja.

Rekurzív szó definiálása

Egy : definíció közvetlenül hívhatja önmagát:

: count-down ( n -- )
    dup 0 = [ drop ] [ dup . 1 - count-down ] if ;

5 count-down
! prints 5 4 3 2 1

Elágazás üres és nem üres esetén

Az if-empty (a sequences része) a rekurzió természetes alapesete:

if-empty ( seq emptyquot nonemptyquot -- )
{ 4 0 9 } [ "empty" ] [ "got data" ] if-empty .
! => "got data"

Az emptyquot úgy fut le, hogy a (üres) sorozatot már elhasználta; a nonemptyquot pedig úgy, hogy a sorozat még a vermen van.

cond: őrzött ágak láncolata

Amikor a rekurziódnak kettőnél több esete van, a cond (a combinators része) segít, hogy a kód olvasható maradjon:

: classify ( n -- label )
    {
        { [ dup 0 < ] [ drop "negative" ] }
        { [ dup 0 = ] [ drop "zero"     ] }
        [ drop "positive" ]
    } cond ;

Előrehivatkozások a DEFER: segítségével

Egy : definíció közvetlenül hívhatja önmagát, de amikor két szó egymást hívja, a Factor az elsőt már azelőtt látja, hogy a második létezne. A DEFER: lefoglal egy nevet, hogy az első definíció le tudjon fordulni:

DEFER: even?

: odd? ( n -- ? ) dup 0 = [ drop f ] [ 1 - even? ] if ;
: even? ( n -- ? ) dup 0 = [ drop t ] [ 1 - odd? ] if ;

A DEFER: akkor is hasznos, ha egy segédszót természetesebb az őt használó szó után olvasni.

Utasítások

Napi darabszámokat vezetsz arról, hány madár látogatja meg a kertedet. Az adatokat egész számok tömbjeként tároljuk, ahol az első elem a mai nap darabszáma.

1. A mai nap darabszáma

Definiáld a today szót úgy, hogy levegyen a veremről egy napi darabszámokat tartalmazó tömböt, és adja vissza a mai nap darabszámát, vagy f-et, ha a tömb üres.

{ 2 5 1 } today .
! => 2

{ } today .
! => f

2. Növeld a mai nap darabszámát

Definiáld az increment-day-count szót úgy, hogy adjon vissza egy új tömböt, amelyben a mai nap darabszáma eggyel megnőtt. Ha a bemenet üres, akkor { 1 }-et adjon vissza.

{ 4 0 2 } increment-day-count .
! => { 5 0 2 }

{ } increment-day-count .
! => { 1 }

3. Volt olyan nap, amikor nem járt madár?

Definiáld a has-day-without-birds? szót úgy, hogy adjon vissza t-t, ha legalább egy napon nulla madarat számoltál, egyébként f-et.

Használj rekurziót az any? vagy más magasabb rendű sorozatszavak helyett.

{ 2 0 4 } has-day-without-birds? .   ! => t
{ 3 8 1 5 } has-day-without-birds? . ! => f

4. Összes madár a kezdés óta

Definiáld a total szót úgy, hogy adja vissza az összes darabszám összegét.

Használj rekurziót a sum helyett.

{ 4 0 9 0 5 } total .
! => 18

5. Forgalmas napok

Egy forgalmas nap az, amikor öt vagy több madár járt nálad. Definiáld a busy-days szót úgy, hogy adja vissza a forgalmas napok számát.

Használj rekurziót a count helyett.

{ 4 5 0 0 6 } busy-days .
! => 2
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Factor Exercism

Készen állsz elkezdeni a(z) Kerti madárszámlálás 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.