module Exercise01 where import Test.QuickCheck import GHC.Float {-H1.1a)-} myPair :: Integer -> Integer -> Integer myPair x y = 2^y * (2*x + 1) - 1 {-H1.1b)-} mySnd :: Integer -> Integer mySnd z | z `mod` 2 == 0 = 0 | otherwise = 1 + mySnd (z `div` 2) {-H1.1c)-} myFst :: Integer -> Integer myFst z = (((z + 1) `div` (2^mySnd z)) - 1) `div` 2 {-H1.1d)-} prop_myPair :: Integer -> Integer -> Integer -> Property prop_myPair p x y = (p > 0 && x > 0 && y > 0) ==> p == myPair 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-} numberToEo :: Integer -> String numberToEo x | log == 0 = digitToEo x | log >= 3 = chooseMiddle log3 (x `div` 10^(log3*3)) ++ if logMLower > 0 then " " ++ numberToEo logMLower else "" | otherwise = (if logUpper > 1 then digitToEo logUpper else "") ++ chooseMinor log ++ if logLower > 0 then " " ++ numberToEo logLower else "" where log = toInteger $integerLogBase 10 x log3 = log `div` 3 logUpper = x `div` 10^log logLower = x `mod` 10^log logMLower = x `mod` 10^(log3*3) digitToEoM 1 = " m" digitToEoM 10 = " dek" digitToEoM x = " " ++ digitToEo x chooseMiddle 1 logMUpper = if logMUpper > 1 then numberToEo logMUpper ++ " mil" else "mil" chooseMiddle log3 logMUpper = numberToEo logMUpper ++ digitToEoM (log3 `div` 2) ++ (if even log3 then "iliono" else "iliardo") ++ if logMUpper > 1 then "j" else "" chooseMinor 2 = "cent" chooseMinor 1 = "dek" {-TTEW-}