module Exercise01 where import Test.QuickCheck {-H1.1a)-} myPair :: Integer -> Integer -> Integer myPair x y | x >= 0, y >= 0 = (2 ^ y) * (2 * x + 1) - 1 {-H1.1b)-} mySnd :: Integer -> Integer mySnd pair = mySndIntern pair 0 mySndIntern :: Integer -> Integer -> Integer mySndIntern pair count | remainder == 0 = count | otherwise = mySndIntern division (count + 1) where (division, remainder) = divMod pair 2 {-H1.1c)-} myFst :: Integer -> Integer myFst pair = ((pair + 1) `div` (2 ^ mySnd pair) - 1) `div` 2 {-H1.1d)-} prop_myPair :: Integer -> Integer -> Integer -> Property prop_myPair p x y = (p >= 0 && x >= 0 && y >= 0) ==> (myPair x y == p) && (mySnd p == y) && (myFst p == x) {-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-} powerTokenTuples = zip [10 ^ x | x <- [1,2] ++ [3,6..66]] ( ["dek", "cent", "mil", "miliono", "miliardo"] ++ [ numberToEo x ++ y | x <- [2..10], y <- ["iliono", "iliardo"]] ) numberToEo :: Integer -> String numberToEo n | n < 10 = digitToEo n | otherwise = numberToEoDetail n x y where (x, y) = last (filter (\(x,y) -> x <= n) powerTokenTuples) numberToEoDetail :: Integer -> Integer -> String -> String numberToEoDetail n divisor token = (if division > 1 || divisor > 1000 then numberToEo division ++ (if divisor > 100 then " " else "") else "") ++ token ++ (if divisor > 1000 && division > 1 then "j" else "") ++ (if remainder > 0 then " " ++ numberToEo remainder else "") where (division, remainder) = divMod n divisor {-TTEW-}