module Exercise01 where import Test.QuickCheck {-H1.1a)-} myPair :: Integer -> Integer -> Integer myPair x y = 2^y * (2 * x + 1) - 1 {-H1.1b)-} mySnd :: Integer -> Integer mySnd p | even p = 0 | otherwise = 1 + mySnd(div p 2) {-H1.1c)-} myFst :: Integer -> Integer myFst p = 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 ==> myPair x y == p && myFst p == x && mySnd p == y prop_myPair_test1 x y = x > 0 && y > 0 ==> prop_myPair (myPair x y) x y prop_myPair_test2 p = p > 0 ==> prop_myPair p (myFst p) (mySnd 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" -- 124 {-WETT-} listOfMils :: Integer -> Integer -> [(Integer, Integer)] listOfMils 0 _ = [] listOfMils n m = listOfMils (div n 1000) (m+1) ++ [(mod n 1000, m)] stringLookup n l s = dropWhile (==' ') $ take l $ drop (fromIntegral n * l) s milToEo :: (Integer, Integer) -> String -- milending strings gotten via something like this: concat $ map (\s -> replicate (12 - length s) ' ' ++ s) $ concat $ transpose [map (\n -> numberToEo n ++ "iliono ") $ [6..10], map (\n -> numberToEo n ++ "iliardo ") $ [6..10]] -- submil string gotten via concat $ map (\s -> replicate (21 - length s) ' ' ++ s) [numberToEo n | n <- [0..999]] and removed nul -- (split at 500 for performance) milToEo (1, 1) = "mil " -- no "uno mil" milToEo (1, m) = "unu " ++ stringLookup m 12 " mil miliono miliardo duiliono duiliardo triiliono triiliardo kvariliono kvariliardo kviniliono kviniliardo sesiliono sesiliardo sepiliono sepiliardo okiliono okiliardo nauiliono nauiliardo dekiliono dekiliardo " milToEo (n, m) = submil ++ " " ++ milendingj where submil = stringLookup (mod n 500) 21 $ if n < 500 then " unu du tri kvar kvin ses sep ok nau dek dek unu dek du dek tri dek kvar dek kvin dek ses dek sep dek ok dek nau dudek dudek unu dudek du dudek tri dudek kvar dudek kvin dudek ses dudek sep dudek ok dudek nau tridek tridek unu tridek du tridek tri tridek kvar tridek kvin tridek ses tridek sep tridek ok tridek nau kvardek kvardek unu kvardek du kvardek tri kvardek kvar kvardek kvin kvardek ses kvardek sep kvardek ok kvardek nau kvindek kvindek unu kvindek du kvindek tri kvindek kvar kvindek kvin kvindek ses kvindek sep kvindek ok kvindek nau sesdek sesdek unu sesdek du sesdek tri sesdek kvar sesdek kvin sesdek ses sesdek sep sesdek ok sesdek nau sepdek sepdek unu sepdek du sepdek tri sepdek kvar sepdek kvin sepdek ses sepdek sep sepdek ok sepdek nau okdek okdek unu okdek du okdek tri okdek kvar okdek kvin okdek ses okdek sep okdek ok okdek nau naudek naudek unu naudek du naudek tri naudek kvar naudek kvin naudek ses naudek sep naudek ok naudek nau cent cent unu cent du cent tri cent kvar cent kvin cent ses cent sep cent ok cent nau cent dek cent dek unu cent dek du cent dek tri cent dek kvar cent dek kvin cent dek ses cent dek sep cent dek ok cent dek nau cent dudek cent dudek unu cent dudek du cent dudek tri cent dudek kvar cent dudek kvin cent dudek ses cent dudek sep cent dudek ok cent dudek nau cent tridek cent tridek unu cent tridek du cent tridek tri cent tridek kvar cent tridek kvin cent tridek ses cent tridek sep cent tridek ok cent tridek nau cent kvardek cent kvardek unu cent kvardek du cent kvardek tri cent kvardek kvar cent kvardek kvin cent kvardek ses cent kvardek sep cent kvardek ok cent kvardek nau cent kvindek cent kvindek unu cent kvindek du cent kvindek tri cent kvindek kvar cent kvindek kvin cent kvindek ses cent kvindek sep cent kvindek ok cent kvindek nau cent sesdek cent sesdek unu cent sesdek du cent sesdek tri cent sesdek kvar cent sesdek kvin cent sesdek ses cent sesdek sep cent sesdek ok cent sesdek nau cent sepdek cent sepdek unu cent sepdek du cent sepdek tri cent sepdek kvar cent sepdek kvin cent sepdek ses cent sepdek sep cent sepdek ok cent sepdek nau cent okdek cent okdek unu cent okdek du cent okdek tri cent okdek kvar cent okdek kvin cent okdek ses cent okdek sep cent okdek ok cent okdek nau cent naudek cent naudek unu cent naudek du cent naudek tri cent naudek kvar cent naudek kvin cent naudek ses cent naudek sep cent naudek ok cent naudek nau ducent ducent unu ducent du ducent tri ducent kvar ducent kvin ducent ses ducent sep ducent ok ducent nau ducent dek ducent dek unu ducent dek du ducent dek tri ducent dek kvar ducent dek kvin ducent dek ses ducent dek sep ducent dek ok ducent dek nau ducent dudek ducent dudek unu ducent dudek du ducent dudek tri ducent dudek kvar ducent dudek kvin ducent dudek ses ducent dudek sep ducent dudek ok ducent dudek nau ducent tridek ducent tridek unu ducent tridek du ducent tridek tri ducent tridek kvar ducent tridek kvin ducent tridek ses ducent tridek sep ducent tridek ok ducent tridek nau ducent kvardek ducent kvardek unu ducent kvardek du ducent kvardek tri ducent kvardek kvar ducent kvardek kvin ducent kvardek ses ducent kvardek sep ducent kvardek ok ducent kvardek nau ducent kvindek ducent kvindek unu ducent kvindek du ducent kvindek tri ducent kvindek kvar ducent kvindek kvin ducent kvindek ses ducent kvindek sep ducent kvindek ok ducent kvindek nau ducent sesdek ducent sesdek unu ducent sesdek du ducent sesdek tri ducent sesdek kvar ducent sesdek kvin ducent sesdek ses ducent sesdek sep ducent sesdek ok ducent sesdek nau ducent sepdek ducent sepdek unu ducent sepdek du ducent sepdek tri ducent sepdek kvar ducent sepdek kvin ducent sepdek ses ducent sepdek sep ducent sepdek ok ducent sepdek nau ducent okdek ducent okdek unu ducent okdek du ducent okdek tri ducent okdek kvar ducent okdek kvin ducent okdek ses ducent okdek sep ducent okdek ok ducent okdek nau ducent naudek ducent naudek unu ducent naudek du ducent naudek tri ducent naudek kvar ducent naudek kvin ducent naudek ses ducent naudek sep ducent naudek ok ducent naudek nau tricent tricent unu tricent du tricent tri tricent kvar tricent kvin tricent ses tricent sep tricent ok tricent nau tricent dek tricent dek unu tricent dek du tricent dek tri tricent dek kvar tricent dek kvin tricent dek ses tricent dek sep tricent dek ok tricent dek nau tricent dudek tricent dudek unu tricent dudek du tricent dudek tri tricent dudek kvar tricent dudek kvin tricent dudek ses tricent dudek sep tricent dudek ok tricent dudek nau tricent tridek tricent tridek unu tricent tridek du tricent tridek tri tricent tridek kvar tricent tridek kvin tricent tridek ses tricent tridek sep tricent tridek ok tricent tridek nau tricent kvardek tricent kvardek unu tricent kvardek du tricent kvardek tri tricent kvardek kvar tricent kvardek kvin tricent kvardek ses tricent kvardek sep tricent kvardek ok tricent kvardek nau tricent kvindek tricent kvindek unu tricent kvindek du tricent kvindek tri tricent kvindek kvar tricent kvindek kvin tricent kvindek ses tricent kvindek sep tricent kvindek ok tricent kvindek nau tricent sesdek tricent sesdek unu tricent sesdek du tricent sesdek tri tricent sesdek kvar tricent sesdek kvin tricent sesdek ses tricent sesdek sep tricent sesdek ok tricent sesdek nau tricent sepdek tricent sepdek unu tricent sepdek du tricent sepdek tri tricent sepdek kvar tricent sepdek kvin tricent sepdek ses tricent sepdek sep tricent sepdek ok tricent sepdek nau tricent okdek tricent okdek unu tricent okdek du tricent okdek tri tricent okdek kvar tricent okdek kvin tricent okdek ses tricent okdek sep tricent okdek ok tricent okdek nau tricent naudek tricent naudek unu tricent naudek du tricent naudek tri tricent naudek kvar tricent naudek kvin tricent naudek ses tricent naudek sep tricent naudek ok tricent naudek nau kvarcent kvarcent unu kvarcent du kvarcent tri kvarcent kvar kvarcent kvin kvarcent ses kvarcent sep kvarcent ok kvarcent nau kvarcent dek kvarcent dek unu kvarcent dek du kvarcent dek tri kvarcent dek kvar kvarcent dek kvin kvarcent dek ses kvarcent dek sep kvarcent dek ok kvarcent dek nau kvarcent dudek kvarcent dudek unu kvarcent dudek du kvarcent dudek tri kvarcent dudek kvar kvarcent dudek kvin kvarcent dudek ses kvarcent dudek sep kvarcent dudek ok kvarcent dudek nau kvarcent tridek kvarcent tridek unu kvarcent tridek du kvarcent tridek tri kvarcent tridek kvar kvarcent tridek kvin kvarcent tridek ses kvarcent tridek sep kvarcent tridek ok kvarcent tridek nau kvarcent kvardek kvarcent kvardek unu kvarcent kvardek du kvarcent kvardek trikvarcent kvardek kvarkvarcent kvardek kvin kvarcent kvardek ses kvarcent kvardek sep kvarcent kvardek ok kvarcent kvardek nau kvarcent kvindek kvarcent kvindek unu kvarcent kvindek du kvarcent kvindek trikvarcent kvindek kvarkvarcent kvindek kvin kvarcent kvindek ses kvarcent kvindek sep kvarcent kvindek ok kvarcent kvindek nau kvarcent sesdek kvarcent sesdek unu kvarcent sesdek du kvarcent sesdek tri kvarcent sesdek kvar kvarcent sesdek kvin kvarcent sesdek ses kvarcent sesdek sep kvarcent sesdek ok kvarcent sesdek nau kvarcent sepdek kvarcent sepdek unu kvarcent sepdek du kvarcent sepdek tri kvarcent sepdek kvar kvarcent sepdek kvin kvarcent sepdek ses kvarcent sepdek sep kvarcent sepdek ok kvarcent sepdek nau kvarcent okdek kvarcent okdek unu kvarcent okdek du kvarcent okdek tri kvarcent okdek kvar kvarcent okdek kvin kvarcent okdek ses kvarcent okdek sep kvarcent okdek ok kvarcent okdek nau kvarcent naudek kvarcent naudek unu kvarcent naudek du kvarcent naudek tri kvarcent naudek kvar kvarcent naudek kvin kvarcent naudek ses kvarcent naudek sep kvarcent naudek ok kvarcent naudek nau" else " kvincent kvincent unu kvincent du kvincent tri kvincent kvar kvincent kvin kvincent ses kvincent sep kvincent ok kvincent nau kvincent dek kvincent dek unu kvincent dek du kvincent dek tri kvincent dek kvar kvincent dek kvin kvincent dek ses kvincent dek sep kvincent dek ok kvincent dek nau kvincent dudek kvincent dudek unu kvincent dudek du kvincent dudek tri kvincent dudek kvar kvincent dudek kvin kvincent dudek ses kvincent dudek sep kvincent dudek ok kvincent dudek nau kvincent tridek kvincent tridek unu kvincent tridek du kvincent tridek tri kvincent tridek kvar kvincent tridek kvin kvincent tridek ses kvincent tridek sep kvincent tridek ok kvincent tridek nau kvincent kvardek kvincent kvardek unu kvincent kvardek du kvincent kvardek trikvincent kvardek kvarkvincent kvardek kvin kvincent kvardek ses kvincent kvardek sep kvincent kvardek ok kvincent kvardek nau kvincent kvindek kvincent kvindek unu kvincent kvindek du kvincent kvindek trikvincent kvindek kvarkvincent kvindek kvin kvincent kvindek ses kvincent kvindek sep kvincent kvindek ok kvincent kvindek nau kvincent sesdek kvincent sesdek unu kvincent sesdek du kvincent sesdek tri kvincent sesdek kvar kvincent sesdek kvin kvincent sesdek ses kvincent sesdek sep kvincent sesdek ok kvincent sesdek nau kvincent sepdek kvincent sepdek unu kvincent sepdek du kvincent sepdek tri kvincent sepdek kvar kvincent sepdek kvin kvincent sepdek ses kvincent sepdek sep kvincent sepdek ok kvincent sepdek nau kvincent okdek kvincent okdek unu kvincent okdek du kvincent okdek tri kvincent okdek kvar kvincent okdek kvin kvincent okdek ses kvincent okdek sep kvincent okdek ok kvincent okdek nau kvincent naudek kvincent naudek unu kvincent naudek du kvincent naudek tri kvincent naudek kvar kvincent naudek kvin kvincent naudek ses kvincent naudek sep kvincent naudek ok kvincent naudek nau sescent sescent unu sescent du sescent tri sescent kvar sescent kvin sescent ses sescent sep sescent ok sescent nau sescent dek sescent dek unu sescent dek du sescent dek tri sescent dek kvar sescent dek kvin sescent dek ses sescent dek sep sescent dek ok sescent dek nau sescent dudek sescent dudek unu sescent dudek du sescent dudek tri sescent dudek kvar sescent dudek kvin sescent dudek ses sescent dudek sep sescent dudek ok sescent dudek nau sescent tridek sescent tridek unu sescent tridek du sescent tridek tri sescent tridek kvar sescent tridek kvin sescent tridek ses sescent tridek sep sescent tridek ok sescent tridek nau sescent kvardek sescent kvardek unu sescent kvardek du sescent kvardek tri sescent kvardek kvar sescent kvardek kvin sescent kvardek ses sescent kvardek sep sescent kvardek ok sescent kvardek nau sescent kvindek sescent kvindek unu sescent kvindek du sescent kvindek tri sescent kvindek kvar sescent kvindek kvin sescent kvindek ses sescent kvindek sep sescent kvindek ok sescent kvindek nau sescent sesdek sescent sesdek unu sescent sesdek du sescent sesdek tri sescent sesdek kvar sescent sesdek kvin sescent sesdek ses sescent sesdek sep sescent sesdek ok sescent sesdek nau sescent sepdek sescent sepdek unu sescent sepdek du sescent sepdek tri sescent sepdek kvar sescent sepdek kvin sescent sepdek ses sescent sepdek sep sescent sepdek ok sescent sepdek nau sescent okdek sescent okdek unu sescent okdek du sescent okdek tri sescent okdek kvar sescent okdek kvin sescent okdek ses sescent okdek sep sescent okdek ok sescent okdek nau sescent naudek sescent naudek unu sescent naudek du sescent naudek tri sescent naudek kvar sescent naudek kvin sescent naudek ses sescent naudek sep sescent naudek ok sescent naudek nau sepcent sepcent unu sepcent du sepcent tri sepcent kvar sepcent kvin sepcent ses sepcent sep sepcent ok sepcent nau sepcent dek sepcent dek unu sepcent dek du sepcent dek tri sepcent dek kvar sepcent dek kvin sepcent dek ses sepcent dek sep sepcent dek ok sepcent dek nau sepcent dudek sepcent dudek unu sepcent dudek du sepcent dudek tri sepcent dudek kvar sepcent dudek kvin sepcent dudek ses sepcent dudek sep sepcent dudek ok sepcent dudek nau sepcent tridek sepcent tridek unu sepcent tridek du sepcent tridek tri sepcent tridek kvar sepcent tridek kvin sepcent tridek ses sepcent tridek sep sepcent tridek ok sepcent tridek nau sepcent kvardek sepcent kvardek unu sepcent kvardek du sepcent kvardek tri sepcent kvardek kvar sepcent kvardek kvin sepcent kvardek ses sepcent kvardek sep sepcent kvardek ok sepcent kvardek nau sepcent kvindek sepcent kvindek unu sepcent kvindek du sepcent kvindek tri sepcent kvindek kvar sepcent kvindek kvin sepcent kvindek ses sepcent kvindek sep sepcent kvindek ok sepcent kvindek nau sepcent sesdek sepcent sesdek unu sepcent sesdek du sepcent sesdek tri sepcent sesdek kvar sepcent sesdek kvin sepcent sesdek ses sepcent sesdek sep sepcent sesdek ok sepcent sesdek nau sepcent sepdek sepcent sepdek unu sepcent sepdek du sepcent sepdek tri sepcent sepdek kvar sepcent sepdek kvin sepcent sepdek ses sepcent sepdek sep sepcent sepdek ok sepcent sepdek nau sepcent okdek sepcent okdek unu sepcent okdek du sepcent okdek tri sepcent okdek kvar sepcent okdek kvin sepcent okdek ses sepcent okdek sep sepcent okdek ok sepcent okdek nau sepcent naudek sepcent naudek unu sepcent naudek du sepcent naudek tri sepcent naudek kvar sepcent naudek kvin sepcent naudek ses sepcent naudek sep sepcent naudek ok sepcent naudek nau okcent okcent unu okcent du okcent tri okcent kvar okcent kvin okcent ses okcent sep okcent ok okcent nau okcent dek okcent dek unu okcent dek du okcent dek tri okcent dek kvar okcent dek kvin okcent dek ses okcent dek sep okcent dek ok okcent dek nau okcent dudek okcent dudek unu okcent dudek du okcent dudek tri okcent dudek kvar okcent dudek kvin okcent dudek ses okcent dudek sep okcent dudek ok okcent dudek nau okcent tridek okcent tridek unu okcent tridek du okcent tridek tri okcent tridek kvar okcent tridek kvin okcent tridek ses okcent tridek sep okcent tridek ok okcent tridek nau okcent kvardek okcent kvardek unu okcent kvardek du okcent kvardek tri okcent kvardek kvar okcent kvardek kvin okcent kvardek ses okcent kvardek sep okcent kvardek ok okcent kvardek nau okcent kvindek okcent kvindek unu okcent kvindek du okcent kvindek tri okcent kvindek kvar okcent kvindek kvin okcent kvindek ses okcent kvindek sep okcent kvindek ok okcent kvindek nau okcent sesdek okcent sesdek unu okcent sesdek du okcent sesdek tri okcent sesdek kvar okcent sesdek kvin okcent sesdek ses okcent sesdek sep okcent sesdek ok okcent sesdek nau okcent sepdek okcent sepdek unu okcent sepdek du okcent sepdek tri okcent sepdek kvar okcent sepdek kvin okcent sepdek ses okcent sepdek sep okcent sepdek ok okcent sepdek nau okcent okdek okcent okdek unu okcent okdek du okcent okdek tri okcent okdek kvar okcent okdek kvin okcent okdek ses okcent okdek sep okcent okdek ok okcent okdek nau okcent naudek okcent naudek unu okcent naudek du okcent naudek tri okcent naudek kvar okcent naudek kvin okcent naudek ses okcent naudek sep okcent naudek ok okcent naudek nau naucent naucent unu naucent du naucent tri naucent kvar naucent kvin naucent ses naucent sep naucent ok naucent nau naucent dek naucent dek unu naucent dek du naucent dek tri naucent dek kvar naucent dek kvin naucent dek ses naucent dek sep naucent dek ok naucent dek nau naucent dudek naucent dudek unu naucent dudek du naucent dudek tri naucent dudek kvar naucent dudek kvin naucent dudek ses naucent dudek sep naucent dudek ok naucent dudek nau naucent tridek naucent tridek unu naucent tridek du naucent tridek tri naucent tridek kvar naucent tridek kvin naucent tridek ses naucent tridek sep naucent tridek ok naucent tridek nau naucent kvardek naucent kvardek unu naucent kvardek du naucent kvardek tri naucent kvardek kvar naucent kvardek kvin naucent kvardek ses naucent kvardek sep naucent kvardek ok naucent kvardek nau naucent kvindek naucent kvindek unu naucent kvindek du naucent kvindek tri naucent kvindek kvar naucent kvindek kvin naucent kvindek ses naucent kvindek sep naucent kvindek ok naucent kvindek nau naucent sesdek naucent sesdek unu naucent sesdek du naucent sesdek tri naucent sesdek kvar naucent sesdek kvin naucent sesdek ses naucent sesdek sep naucent sesdek ok naucent sesdek nau naucent sepdek naucent sepdek unu naucent sepdek du naucent sepdek tri naucent sepdek kvar naucent sepdek kvin naucent sepdek ses naucent sepdek sep naucent sepdek ok naucent sepdek nau naucent okdek naucent okdek unu naucent okdek du naucent okdek tri naucent okdek kvar naucent okdek kvin naucent okdek ses naucent okdek sep naucent okdek ok naucent okdek nau naucent naudek naucent naudek unu naucent naudek du naucent naudek tri naucent naudek kvar naucent naudek kvin naucent naudek ses naucent naudek sep naucent naudek ok naucent naudek nau" milendingj = stringLookup m 13 " mil milionoj miliardoj duilionoj duiliardoj triilionoj triiliardoj kvarilionoj kvariliardoj kvinilionoj kviniliardoj sesilionoj sesiliardoj sepilionoj sepiliardoj okilionoj okiliardoj nauilionoj nauiliardoj dekilionoj dekiliardoj " numberToEo :: Integer -> String numberToEo 0 = "nul" numberToEo n = init $ concatMap milToEo $ filter ((>0) . fst) $ listOfMils n 0 {-TTEW-} test_numberToEo_ex :: () -> [(Integer, String, String)] test_numberToEo_ex () = [(n, s, numberToEo n) | (n, s) <- [ (0, "nul"), (1, "unu"), (10, "dek"), (20, "dudek"), (234000, "ducent tridek kvar mil"), (42, "kvardek du"), (1984, "mil naucent okdek kvar"), (234567, "ducent tridek kvar mil kvincent sesdek sep"), (937191, "naucent tridek sep mil cent naudek unu"), (10^6, "unu miliono"), (2*10^6, "du milionoj"), (1*10^9, "unu miliardo"), (2*10^9, "du miliardoj"), (12345678, "dek du milionoj tricent kvardek kvin mil sescent sepdek ok"), (10^60, "unu dekiliono"), (12*10^63, "dek du dekiliardoj") ], numberToEo n /= s] test_listOfMils_ex :: () -> Bool test_listOfMils_ex () = listOfMils 1 0 == [(1, 0)] && listOfMils 10 0 == [(10, 0)] test_milToEo_ex :: () -> Bool test_milToEo_ex () = milToEo (1, 0) == "unu"