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 p | p >= 0 && even (p + 1) = mySnd (div (p + 1) 2 - 1) + 1 | p >= 0 && odd (p + 1) = 0 {-H1.1c)-} myFst :: Integer -> Integer myFst p | p >= 0 = div (div (p + 1) (2 ^ mySnd p) - 1) 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 0 = "nul" numberToEo n = number n 0 number :: Integer -> Integer -> String number n x | x == 0 = number d0 1 ++ printIf (printIf " " d0 ++ digitToEo m0) m0 | x == 1 = number d0 2 ++ printIf (printIf " " d0 ++ printIf (digitToEo m0) (m0 - 1) ++ "dek") m0 | x == 2 = (if d0 > 0 then number d0 3 else "") ++ printIf (printIf " " d0 ++ printIf (digitToEo m0) (m0 - 1) ++ "cent") m0 | x == 3 = number d000 6 ++ printIf (printIf " " d000 ++ printIf (number m000 0 ++ " ") (m000 - 1) ++ "mil") m000 | x < 64 = number d000 (x + 3) ++ printIf (printIf " " d000 ++ number m000 0 ++ " " ++ ending x ++ printIf "j" (m000 - 1)) m000 | otherwise = "" where d0 = div n 10 m0 = mod n 10 d000 = div n 1000 m000 = mod n 1000 ending :: Integer -> String ending x | x == 6 = "miliono" | x == 9 = "miliardo" | mod x 6 == 0 = number (div x 6) 0 ++ "iliono" | otherwise = number (div (x - 3) 6) 0 ++ "iliardo" printIf :: String -> Integer -> String printIf s c = if c > 0 then s else "" {-TTEW-}