module Exercise01 where import Data.List import Test.QuickCheck {-H1.1a)-} myPair :: Integer -> Integer -> Integer myPair x y = (2 ^ y) * ((2 * x) + 1) - 1 {-H1.1b)-} mySnd :: Integer -> Integer mySnd z = aux (z + 1) where aux z | even z = aux (div z 2) + 1 | otherwise = 0 prop_mySnd x y = x > 0 && y > 0 ==> mySnd (myPair x y) == y {-H1.1c)-} myFst :: Integer -> Integer myFst z = aux (z + 1) where aux z | even z = aux (div z 2) | odd z = div (z -1) 2 prop_myFst x y = x > 0 && y > 0 ==> myFst (myPair x y) == x {-H1.1d)-} prop_myPair :: Integer -> Integer -> Integer -> Property prop_myPair p x y = p >= 0 && x >= 0 && y >= 0 ==> myPair x y == p {-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 = unwords . filter (/= ".") $ helper n 0 helper :: Integer -> Integer -> [String] helper 0 _ = [] helper n e = helper (div n 10) (succ e) ++ [digit e $ mod n 1000, thousandSuffix e $ mod n 1000] digit :: Integer -> Integer -> String digit 3 1 = "." digit e n = genericIndex allDigits $ 10 * mod e 3 + mod n 10 allDigits :: [String] allDigits = words ". unu du tri kvar kvin ses sep ok nau . dek dudek tridek kvardek kvindek sesdek sepdek okdek naudek . cent ducent tricent kvarcent kvincent sescent sepcent okcent naucent" allSuffixe :: [String] allSuffixe = words ". . . . . . mil mil . . . . miliono milionoj . . . . miliardo miliardoj . . . . duiliono duilionoj . . . . duiliardo duiliardoj . . . . triiliono triilionoj . . . . triiliardo triiliardoj . . . . kvariliono kvarilionoj . . . . kvariliardo kvariliardoj . . . . kviniliono kvinilionoj . . . . kviniliardo kviniliardoj . . . . sesiliono sesilionoj . . . . sesiliardo sesiliardoj . . . . sepiliono sepilionoj . . . . sepiliardo sepiliardoj . . . . okiliono okilionoj . . . . okiliardo okiliardoj . . . . nauiliono nauilionoj . . . . nauiliardo nauiliardoj . . . . dekiliono dekilionoj . . . . dekiliardo dekiliardoj . . . ." thousandSuffix :: Integer -> Integer -> String thousandSuffix _ 0 = "." -- group is 0 => no suffix thousandSuffix e group = genericIndex allSuffixe (e * 2 + min 1 (div group 2)) {-TTEW-}