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 x = if even x then 0 else 1 + mySnd (div x 2) {-H1.1c)-} myFst :: Integer -> Integer myFst x = div (x + 1) (2 ^ (mySnd x + 1)) {-H1.1d)-} prop_myPair :: Integer -> Integer -> Integer -> Property prop_myPair p x y = x>=0 && y>=0 && p>=0 ==> (myFst p == x) && (mySnd p == 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-} digits = ["nul", "unu", "du", "tri", "kvar", "kvin", "ses", "sep", "ok", "nau", "dek"] pat1 = ["", "dek", "cent"] fullPat = "":[" mil", " miliono", " miliardo"] ++ [" "++x++y | x <- drop 2 digits, y <- ["iliono", "iliardo"]] plural x | fst x == 1 = x | otherwise = (fst x, snd x++"j") numberToEo :: Integer -> String numberToEo 0 = "nul" numberToEo x = unwords (reverse [uncurry process z | z <- take 2 xs ++ [plural y | y <- drop 2 xs] , fst z > 0]) where xs = zip (listefy x 1000) fullPat listefy 0 _ = [] listefy x y = mod x y:listefy (div x y) y process val str | str == " mil" && val == 1 = "mil" | otherwise = unwords (reverse [uncurry chn z | z <- xs, uncurry chn z /= ""])++str where xs = zip (listefy val 10) pat1 chn x s | x == 0 = "" | x == 1 = if null s then "unu" else s | otherwise = (digits!!fromInteger x) ++ s {-TTEW-}