view exercises/src/Exercise_2.hs @ 10:50f08a46ea10

week 2 homework
author Markus Kaiser <markus.kaiser@in.tum.de>
date Sun, 11 Nov 2012 20:01:54 +0100
parents f1a337c9f260
children
line wrap: on
line source

module Exercise_2 where
import Test.QuickCheck
import Data.List

{---------------------------------------------------------------------}
{- Aufgabe G2.1 -}
all_sums :: [Integer] -> [Integer] -> [Integer]
all_sums xs ys = [x + y | x <- xs, y <- ys]


evens :: [Integer] -> [Integer]
evens xs = [x | x <- xs, even x]


n_lists :: [Integer] -> [[Integer]]
n_lists xs = [[1..x] | x <- xs]


all_even_sum_lists :: [Integer] -> [Integer] -> [[Integer]]
all_even_sum_lists xs ys = [[1..(x+y)] | x <- xs, y <- ys, even (x+y)]



{---------------------------------------------------------------------}
{- Aufgabe G2.2 -}
union'' :: [Integer] -> [Integer] -> [Integer]
union'' xs ys = xs ++ ys


intersection :: [Integer] -> [Integer] -> [Integer]
intersection xs ys = [x | x <- xs, x `elem` ys]
-- Alternativ ohne elem:
-- intersection xs ys = [x | x <- xs, y <- ys, x == y]


diff :: [Integer] -> [Integer] -> [Integer]
diff xs ys = [x | x <- xs, not(x `elem` ys)]


elem' :: Integer -> [Integer] -> Bool
elem' x xs = [y | y <- xs, y == x] /= [] 


union' :: [Integer] -> [Integer] -> [Integer]
union' xs ys = diff xs ys ++ ys



{---------------------------------------------------------------------}
{- Aufgabe G2.3 -}
eq_frac :: (Integer,Integer) -> (Integer,Integer) -> Bool
eq_frac (a,b) (c,d) = a * d == c * b


intersection_frac :: [(Integer,Integer)] -> [(Integer,Integer)] -> [(Integer,Integer)]
intersection_frac xs ys = [x | x <- xs, y <- ys, x `eq_frac` y]



{---------------------------------------------------------------------}
{- Aufgabe G2.4 -}
pow2_slow :: Integer -> Integer
pow2_slow 0 = 1
pow2_slow n | n > 0 = 2 * pow2_slow (n - 1)


pow2 :: Integer -> Integer
pow2 0 = 1
pow2 n
        | n < 0 = error "Postive n only"
        | even n = pow2 (n `div` 2) ^ 2
        | otherwise = 2 * pow2 (n - 1)



{---------------------------------------------------------------------}
{- Aufgabe G2.5 -}
reachable :: [(Integer, Integer)] -> Integer -> [(Integer, Integer)]
reachable graph 0 = nub $ concat [[(u, u), (v, v)] | (u, v) <- graph]
reachable graph 1 = graph
reachable graph n | n > 0 = [(u, x) | (u, v) <- graph, (w, x) <- reachable graph (n-1), v == w]



{---------------------------------------------------------------------}
{- Aufgabe H2.1 -}
factorial :: Integer -> Integer
factorial 0 = 1
factorial n = n * factorial (n - 1)

factorials :: [Integer] -> [Integer]
factorials ns = [factorial n | n <- ns, n >= 0]

prop_factorialsDistrib cs cs' =
  factorials (cs ++ cs') == factorials cs ++ factorials cs'
prop_factorialsOne n = factorials [n] == (if n < 0 then [] else [factorial n])
prop_factorialsNil = factorials [] == []


count :: [Char] -> Char -> Integer
count cs c = genericLength [c' | c' <- cs, c' == c]

count' :: [Char] -> Char -> Integer
count' cs c = sum [1 | c' <- cs, c' == c]



{---------------------------------------------------------------------}
{- Aufgabe H2.2 -}
lookupTab :: [Integer] -> [(Integer, [Char])] -> [[[Char]]]
lookupTab keys tab = [[v | (k,v) <- tab, key == k] | key <- keys]



{---------------------------------------------------------------------}
{- Aufgabe H2.3 -}
wordsOfLength :: [Char] -> Integer -> [[Char]]
wordsOfLength alphabet 0 = [[]]
wordsOfLength alphabet n = [[a] ++ s | a <- alphabet, s <- wordsOfLength alphabet (n - 1)]



{---------------------------------------------------------------------}
{- Aufgabe H2.4 -}
perms :: [Char] -> [[Char]]
perms xs | xs == "" = [""]
         | otherwise =
             reverse (sort (nub ([ys ++ [y] |
               y <- xs, ys <- perms (delete y xs)])))

perms' :: [Char] -> [[Char]]
perms' "" = [""]
perms' xs = [ys ++ [y] | y <- sort $ nub xs, ys <- perms' $ delete y xs]

perms'' :: [Char] -> [[Char]]
perms'' "" = [""]
perms'' xs = reverse [y : ys | y <- sort $ nub xs, ys <- perms'' $ delete y xs]