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