module Exercise01 where import Test.QuickCheck {-H1.1a)-} myPair :: Integer -> Integer -> Integer myPair x y = 2^y * ( 2*x + 1) -1 {-H1.1b)-} mySnd :: Integer -> Integer mySnd z | even z =0 | otherwise = mySnd (div (z+1) 2 - 1) + 1 {-H1.1c)-} myFst :: Integer -> Integer myFst z = div (div (z + 1) (2 ^ mySnd z) - 1) 2 {-H1.1d)-} prop_myPair :: Integer -> Integer -> Integer -> Property prop_myPair x y p = p >= 0 && x >= 0 && y >= 0 ==> myPair (myFst p) (mySnd p) == p && (myFst(myPair x y), mySnd(myPair x y)) == (x,y) {-H2-} digitToEo :: Integer -> String digitToEo 0 = "nul" digitToEo 1 = "unu" digitToEo 2 = "du" digitToEo 3 = "tri" digitToEo 4 = "kvar" digitToEo 5 = "kvin" digitToEo 6 = "ses" digitToEo 7 = "sep" digitToEo 8 = "ok" digitToEo 9 = "nau" {-WETT-} decToEo :: Integer -> String decToEo 1 = "dek" decToEo 2 = "cent" milPrefix :: Integer ->String milPrefix k | k < 4 = " m" | k > 19 = " " ++ decToEo 1 | otherwise = " " ++ digitToEo (div k 2) milToEo :: Integer -> Integer -> String milToEo k pref | pref == 0 ="" | k == 1 = milPrefix k ++ "il" | even k = milPrefix k ++ "iliono" ++ (if pref /= 1 then "j" else "") | odd k = milPrefix k ++ "iliardo" ++ (if pref /= 1 then "j" else "") digitToEo2 :: Integer -> Integer -> String digitToEo2 n k | mod (div n (10^k)) 10 == 0 = "" | k == 0 = " " ++ digitToEo (mod n 10) | mod (div n (10^k)) 10 == 1 = " " ++ decToEo k | otherwise = " " ++ digitToEo (mod (div n (10^k)) 10) ++ decToEo k numberToEoRek :: Integer -> Integer-> String numberToEoRek n set | div n 1000 < 1 = [c | str <- [digitToEo2 n k | k <- [2,1,0]] , c <- str] | div n 1000 == 1 && set == 1 = milToEo set (mod (div n 1000) 1000) ++ numberToEoRek (mod n 1000) 0 | otherwise = numberToEoRek (div n 1000) (set+1) ++ milToEo set (mod (div n 1000) 1000) ++ numberToEoRek (mod n 1000) 0 numberToEo :: Integer -> String numberToEo 0 = "nul" numberToEo n = drop 1 (numberToEoRek n 1) {-TTEW-}