A Clojure-ben a listák kollekciók, akárcsak a többi nyelv listái. A Lisp család többi nyelvéhez hasonlóan a Clojure is zárójelekkel fejezi ki a listákat.
A Clojure-listákat kétféleképpen hozhatod létre: létrehozhatod őket a list függvénnyel, vagy úgy, hogy egy literál listát quote-olsz.
A listák azért különlegesek, mert a Clojure hívásként kezeli őket. A hívásnak egy operátorral kell kezdődnie, ami általában egy függvény. A lista többi elemét operandusnak tekinti, azaz ezek lesznek a függvény argumentumai.
Amiatt, hogy a Clojure ilyen különlegesen kezeli a listákat, nem hozhatunk létre közvetlenül listaliterált. Ha egy listát quote-tal vagy annak ' rövidítésével idézel, az jelzi, hogy a listát nem szabad kiértékelni.
Néhány modern nyelvvel ellentétben a Clojure listái heterogének, azaz belül többféle típusú elemet is tartalmazhatnak, például '(2 "a" "b" 3).
A többi Lisptől eltérően a Clojure-ben az üres lista igaz értékűnek számít, és nem ugyanaz, mint a nil vagy a false.
Elyse igazán várja, hogy pókerezhessen (és más kártyajátékokat is játsszon) a közelgő vegasi útja során. Mivel nagy rajongója az „önkövetésnek”, szeretne összeállítani néhány kis függvényt, amelyek segítenek neki a követési feladataiban, és megkért, hogy segíts neki átgondolni őket.
Elyse különösen kedveli a pókert, és szeretné követni, hogy hány kört játszik, és hogy mely körök azok. Minden körnek saját száma van, és minden asztal mutatja az éppen játszott kör számát. Elyse kiválaszt egy asztalt, és leül játszani az első körét. Három kört tervez játszani.
Készíts egy rounds függvényt, amely megkapja az aktuális kör számát, és egyetlen list-et ad vissza azzal a körrel és a következő kettővel, amelyek sorra kerülnek:
(rounds 27)
;;=> (27 28 29)
Elyse játszott néhány kört az első asztalnál, aztán szünetet tartott, és még néhány kört játszott egy második asztalnál ... de végül minden asztalnál más listája lett! Szeretné a két listát összeilleszteni, hogy egy helyen tudja követni az összes pókerkört.
Készíts egy concat-rounds függvényt, amely két listát kap, és egyetlen list-et ad vissza, amely az első list összes körét tartalmazza, majd a második list összes körét:
(concat-rounds '(27 28 29) '(35 36))
;;=> (27 28 29 35 36)
Néhány korábbi pókerkörről beszélgetve egy másik játékos megjegyzi, hogy kettő közülük mennyire hasonlóan zajlott le. Elyse nem biztos benne, hogy ő játszotta-e azokat a köröket vagy sem.
Készíts egy contains-round? függvényt, amely két argumentumot kap: a lejátszott körök listáját és egy körszámot.
A függvény true-t ad vissza, ha a kör benne van a lejátszott körök listájában, és false-t, ha nem:
(contains-round? '(27 28 29 35 36) 29)
;;=> true
(contains-round? '(27 28 29 35 36) 30)
;;=> false
Elyse ki szeretne próbálni egy új játékot, amelyet Black Joe-nak hívnak. Hasonló a Black Jackhez, ahol az a cél, hogy a kezedben lévő kártyák összege elérjen egy célértéket, de a Black Joe-ban az a cél, hogy a kártyaértékek átlaga 7 legyen. Az átlagot úgy kapod meg, hogy összeadod az összes kártyaértéket, majd az összeget elosztod a kézben lévő kártyák számával.
Készíts egy card-average függvényt, amely visszaadja egy Black Joe-kéz átlagos értékét.
(card-average '(5 6 7))
;;=> 6.0
A Black Joe-ban a sebesség fontos. Elyse megpróbál egy gyorsabb módot találni az átlag kiszámítására.
Két módot gondolt ki arra, hogy átlagszerű számot kapjon:
Készítsd el az approx-average? függvényt, amely megkapja a hand listát, amely a kezedben lévő kártyák értékeit tartalmazza.
Add vissza true-t, ha a fent említett stratégiák közül valamelyik or mindkettő olyan számot ad, amely egyenlő a tényleges átlaggal.
Megjegyzés: Az összes kéz hossza páratlan, hogy könnyebb legyen megtalálni a mediánt.
(approx-average? '(1 2 3))
;;=> true
(approx-average? '(2 3 4 8 8))
;;=> true
(approx-average? '(1 2 3 5 9))
;;=> false
Az átlagolási kísérletének eredményein felbuzdulva Elyse azon gondolkodik, hogy vajon ugyanazt az eredményt adná-e, ha a páros pozíciókon lévő kártyák átlagát venné, mint a páratlan pozíciókon lévő kártyák átlaga. Ideje egy újabb tesztfüggvénynek!
Készíts egy average-even-odd? függvényt, amely egy Boolean értéket ad vissza, jelezve, hogy a páros indexű kártyák átlaga ugyanaz-e, mint a páratlan indexű kártyák átlaga.
(average-even-odd? '(1 2 3))
;;=> true
(average-even-odd? '(1 2 3 4))
;;=> false
A Black Joe-ban minden 11. kéz bónuszkéz, amelyre bónuszszabály vonatkozik: ha az utolsó húzott kártya egy Jack, megduplázod az értékét.
Készíts egy maybe-double-last függvényt, amely megkap egy kezet, és ellenőrzi, hogy az utolsó kártya Jack-e (11).
Ha az utolsó kártya valóban Jack (11), duplázd meg az értékét, mielőtt visszaadod a kezet.
(maybe-double-last '(5 9 11))
;;=> '(5 9 22)
(maybe-double-last '(5 9 10))
;;=> '(5 9 10)
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Clojure nyelvet 12 fogalom105 feladat segítségével, valódi emberi mentorálással, mindez ingyen.