Neljas kodutöö
1. Ülesanne (2/5 punkti)
Genereerida lõpmatu list, mille elemendid on kasvavas järjestuses sellised mittenegatiivsed paarisarvude kuubid, mille ruudu täisarvulisel jagamisel seitsmega saadakse jääk kaks.
St. 64, 1000 jne. kuna 4^3=64, 4*4 =16, 16 `mod` 7 = 2
10^3=1000, 10*10=100, 100 `mod` 7 = 2.
kasutades listikomprehensiooni
arvud1 :: [Int] arvud1 = undefined
kasutades iterate, map ja filter funktsioone.
arvud2 :: [Int] arvud2 = undefined
2. Ülesanne (1/5 punkti)
Olgu binaarpuud defineeritud järgnevalt:
data BinTree a = Leaf (Maybe a) | Node (BinTree a) a (BinTree a)
deriving (Eq, Show)
Ehk siis puid esitatakse selliselt:
Node
/ | \
Leaf 2 Node
| / | \ = Node (Leaf (Just 1)) 2 (Node (Leaf (Just 3))
Just Leaf 4 Leaf 4 (Leaf (Just 5)))
| | |
1 3 5
Teha funktsioon, mis loob listist "vasakule kaldu" oleva puu, st.
Node
/ | \
vasak [1,2,3] = Node 1 Leaf
/ | \ |
Leaf 2 Leaf Nothing
| |
Just Nothing
|
3
Leaf
vasak [] = |
Nothing
vasak :: [Int] -> BinTree Int vasak = undefined
3. Ülesanne (2/5 punkti)
Kirjutada funktsioon maksimaalse arvu leidmiseks kahendpuust.
maks :: BinTree Int -> Maybe Int maks = undefined
4. Ülesanne (1 punkt)
Faili alguses impordime räside arvutamise teegi:
import Data.Hashable
Et seda kasutada peame installima ka vastava paketi:
stack install hashable
Simuleerime plokiahelat järgnevate andmastruktuuridega
type R2si = Int
type Nimi = String
type Raha = Int
type Nonce = Int
data BC = BC0 [(Nimi, Raha)]
| BCN BC R2si (Nimi, Nimi, Raha) Nonce deriving (Show)
Plokiahela alguses on plokk BC0, kuhu on salvestatud raha algseisud. Näiteks:
start = BC0 [("Kalmer", 100), ("Simmo", 100), ("Mirjam", 100)]
Iga järgnev plokk on BCN plokk, milles on järgnevad komponendid:
- viit eelnevale plokile
- eelneva ploki räsi (täisarv)
- ülekandekolmik (kellelt, kellele, summa)
- nonce --- täisarv, mis koos plokiga räsitakse
Ahela igale plokile vastab täisarv ehk räsi
r2si :: BC -> R2si r2si (BC0 xs) = hashWithSalt 0 xs r2si (BCN _ h (f,t,m) n) = hashWithSalt n (h,f,t,m)
BCN plokk on sobiv vaid siis, kui tema räsi vastab tingimusele
r2siTingimus h = h > 0 && h < 2^58
Alamülesanne a: (2/5 punkti).
Implementeeri funktsioon kontrolliTingimused b, mis kontrollib et räsi tingimus kehtib kogu ahela igas BCN plokis.
kontrolliTingimused :: BC -> Bool kontrolliTingimused = undefined
Alamülesanne b: (1/5 punkti).
Implementeeri funktsioon kontrolliR2si b, mis kontrollib, kas BCN plokkidesse on eelneva ploki räsi korrektselt salvestatud.
kontrolliR2si :: BC -> Bool kontrolliR2si = undefined
Alamülesanne c: (2/5 punkti).
Implementeeri funktsioon uusPlokk b f t m, mis arvutab uue ploki, kus isikult f on isikule t üle kantud m ühikut raha. Tulemuseks saadud ploki räsi peab vastama r2siTingimus-ele. (Tuleb katsetades leida sobiv nonce. Võib eeldada, et selline leidub. Raha olemasolu pole vaja kontrollida s.t. võib minna miinusesse.)
uusPlokk :: BC -> Nimi -> Nimi -> Raha -> BC uusPlokk = undefined