module Exercise01 where import Test.QuickCheck {-H1.1a)-} myPair :: Integer -> Integer -> Integer myPair x y = 2^y * (2 * x + 1) - 1 {-H1.1b)-} mySndHelper :: Integer -> Integer mySndHelper z = if z `mod` 2 == 0 then 1 + mySndHelper(z `div` 2) else 0 mySnd :: Integer -> Integer mySnd z = mySndHelper (z + 1) {-H1.1c)-} --myFstHelper :: Integer -> Integer {-myFstHelper p | p `mod` 2 == 0 = myFstHelper(p `div` 2) | otherwise = (p - 1) `div` 2-} myFstHelper p = if p `mod` 2 == 0 then myFstHelper(p `div` 2) else (p - 1) `div` 2 myFst :: Integer -> Integer myFst z = myFstHelper (z + 1) {-H1.1d)-} prop_myPair :: Integer -> Integer -> Integer -> Property prop_myPair p x y = x >= 0 && y >= 0 && p >= 0 ==> myPair x y == p --prop_myPair p x y = undefined {-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-} changeNul 0 = "" changeNul x = digitToEo x numberToEo :: Integer -> String numberToEo 0 = "nul" numberToEo n = numRecursiveEo n numRecursiveEo:: Integer -> String numRecursiveEo x |count <= 6 = generalHisp x |otherwise = generalHisp(x `div` nThree) ++ spaceHelp(getXillardo $ div (count-1) 6) ++ higherNumberName (count-1) ++ multiJ (x `div` nThree) ++ spaceHelp(numRecursiveEo $ mod x nThree) where count = countIntLength x nThree = 10^(getExponent(count - 1)) higherNumberName c | c `mod` 6 < 3 = "iliono" | otherwise = "iliardo" getExponent c | c `mod` 6 >= 3 = ( c `div` 6 ) * 6 + 3 | otherwise = ( c `div` 6 ) * 6 getXillardo :: Integer -> String getXillardo 1 = "m" getXillardo 10 = "dek" getXillardo c = changeNul c multiJ :: Integer -> [Char] multiJ z | z == 1 = "" | otherwise = "j" generalHisp :: Integer -> String generalHisp x | x >= 2000 = generalHisp (x `div` 1000) ++ " mil" ++ spaceHelp(generalHisp $ mod x 1000) | x >= t && t>=10 = firstDigit x t ++ names x ++ spaceHelp(generalHisp $ mod x t) | otherwise = changeNul x where t = 10^(countIntLength x - 1) firstDigit :: Integer -> Integer -> String firstDigit x y = if x >= 2*y then changeNul $ div x y else "" names :: Integer -> String names x | x < 100 = "dek" | x < 1000 = "cent" | otherwise = "mil" --fügt Leerzeichen hinzu, wenn nötig spaceHelp :: String -> String spaceHelp s |length s > 0 = " " ++ s |otherwise = "" countIntLength x = if x < 10 then 1 else (1 + countIntLength(div x 10)) {-TTEW-}