annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
1 module Exercise_2 where
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
2 import Test.QuickCheck
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
3 import Data.List
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
4
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
5 {---------------------------------------------------------------------}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
6 {- Aufgabe G2.1 -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
7 all_sums :: [Integer] -> [Integer] -> [Integer]
5
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
8 all_sums xs ys = [x + y | x <- xs, y <- ys]
2
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
9
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
11 evens :: [Integer] -> [Integer]
5
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
12 evens xs = [x | x <- xs, even x]
2
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
13
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
14
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
15 n_lists :: [Integer] -> [[Integer]]
5
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
16 n_lists xs = [[1..x] | x <- xs]
2
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
17
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
18
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
19 all_even_sum_lists :: [Integer] -> [Integer] -> [[Integer]]
5
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
20 all_even_sum_lists xs ys = [[1..(x+y)] | x <- xs, y <- ys, even (x+y)]
2
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
21
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
22
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
23
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
24 {---------------------------------------------------------------------}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
25 {- Aufgabe G2.2 -}
5
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
26 union'' :: [Integer] -> [Integer] -> [Integer]
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
27 union'' xs ys = xs ++ ys
2
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
28
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
29
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
30 intersection :: [Integer] -> [Integer] -> [Integer]
5
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
31 intersection xs ys = [x | x <- xs, x `elem` ys]
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
32 -- Alternativ ohne elem:
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
33 -- intersection xs ys = [x | x <- xs, y <- ys, x == y]
2
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
34
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
35
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
36 diff :: [Integer] -> [Integer] -> [Integer]
5
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
37 diff xs ys = [x | x <- xs, not(x `elem` ys)]
2
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
38
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
39
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
40 elem' :: Integer -> [Integer] -> Bool
5
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
41 elem' x xs = [y | y <- xs, y == x] /= []
2
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
42
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
43
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
44 union' :: [Integer] -> [Integer] -> [Integer]
5
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
45 union' xs ys = diff xs ys ++ ys
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
46
2
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
47
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
48
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
49 {---------------------------------------------------------------------}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
50 {- Aufgabe G2.3 -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
51 eq_frac :: (Integer,Integer) -> (Integer,Integer) -> Bool
5
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
52 eq_frac (a,b) (c,d) = a * d == c * b
2
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
53
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
54
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
55 intersection_frac :: [(Integer,Integer)] -> [(Integer,Integer)] -> [(Integer,Integer)]
5
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
56 intersection_frac xs ys = [x | x <- xs, y <- ys, x `eq_frac` y]
2
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
57
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
58
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
59
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
60 {---------------------------------------------------------------------}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
61 {- Aufgabe G2.4 -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
62 pow2_slow :: Integer -> Integer
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
63 pow2_slow 0 = 1
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
64 pow2_slow n | n > 0 = 2 * pow2_slow (n - 1)
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
65
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
66
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
67 pow2 :: Integer -> Integer
5
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
68 pow2 0 = 1
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
69 pow2 n
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
70 | n < 0 = error "Postive n only"
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
71 | even n = pow2 (n `div` 2) ^ 2
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
72 | otherwise = 2 * pow2 (n - 1)
2
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
73
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
74
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
75
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
76 {---------------------------------------------------------------------}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
77 {- Aufgabe G2.5 -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
78 reachable :: [(Integer, Integer)] -> Integer -> [(Integer, Integer)]
5
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
79 reachable graph 0 = nub $ concat [[(u, u), (v, v)] | (u, v) <- graph]
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
80 reachable graph 1 = graph
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
81 reachable graph n | n > 0 = [(u, x) | (u, v) <- graph, (w, x) <- reachable graph (n-1), v == w]
2
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
82
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
83
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
84
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
85 {---------------------------------------------------------------------}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
86 {- Aufgabe H2.1 -}
10
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
87 factorial :: Integer -> Integer
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
88 factorial 0 = 1
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
89 factorial n = n * factorial (n - 1)
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
90
2
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
91 factorials :: [Integer] -> [Integer]
10
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
92 factorials ns = [factorial n | n <- ns, n >= 0]
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
93
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
94 prop_factorialsDistrib cs cs' =
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
95 factorials (cs ++ cs') == factorials cs ++ factorials cs'
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
96 prop_factorialsOne n = factorials [n] == (if n < 0 then [] else [factorial n])
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
97 prop_factorialsNil = factorials [] == []
2
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
98
5
f1a337c9f260 week 2 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 2
diff changeset
99
2
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
100 count :: [Char] -> Char -> Integer
10
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
101 count cs c = genericLength [c' | c' <- cs, c' == c]
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
102
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
103 count' :: [Char] -> Char -> Integer
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
104 count' cs c = sum [1 | c' <- cs, c' == c]
2
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
105
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
106
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
107
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
108 {---------------------------------------------------------------------}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
109 {- Aufgabe H2.2 -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
110 lookupTab :: [Integer] -> [(Integer, [Char])] -> [[[Char]]]
10
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
111 lookupTab keys tab = [[v | (k,v) <- tab, key == k] | key <- keys]
2
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
112
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
113
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
114
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
115 {---------------------------------------------------------------------}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
116 {- Aufgabe H2.3 -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
117 wordsOfLength :: [Char] -> Integer -> [[Char]]
10
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
118 wordsOfLength alphabet 0 = [[]]
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
119 wordsOfLength alphabet n = [[a] ++ s | a <- alphabet, s <- wordsOfLength alphabet (n - 1)]
2
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
120
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
121
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
122
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
123 {---------------------------------------------------------------------}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
124 {- Aufgabe H2.4 -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
125 perms :: [Char] -> [[Char]]
10
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
126 perms xs | xs == "" = [""]
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
127 | otherwise =
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
128 reverse (sort (nub ([ys ++ [y] |
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
129 y <- xs, ys <- perms (delete y xs)])))
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
130
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
131 perms' :: [Char] -> [[Char]]
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
132 perms' "" = [""]
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
133 perms' xs = [ys ++ [y] | y <- sort $ nub xs, ys <- perms' $ delete y xs]
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
134
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
135 perms'' :: [Char] -> [[Char]]
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
136 perms'' "" = [""]
50f08a46ea10 week 2 homework
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 5
diff changeset
137 perms'' xs = reverse [y : ys | y <- sort $ nub xs, ys <- perms'' $ delete y xs]