1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
-- Exercise 1
prodEvens :: Num a => [a] -> a
prodEvens xs = foldr (*) 1 [xs!!i |i <- [0..length xs-1], i `mod` 2 == 0]
-- Exercise 2
controller :: String -> String
controller s = calc s 0 0 0
where
calc "" _ _ _ = []
calc str doorpos dir oldDir = case head str of
'.' -> show (doorpos + dir) ++ calc (tail str) (doorpos + dir) (if (doorpos+dir) == 5 || (doorpos+dir) == 0 then 0 else dir) oldDir
'P' -> let pdir = pushBtn doorpos dir oldDir in show (doorpos + pdir) ++ calc (tail str) (doorpos + pdir) pdir dir
'O' -> let ndir = dir * (-1) in show (doorpos + ndir) ++ calc (tail str) (doorpos + ndir) ndir oldDir
fixDir c d = if c == 5 || c == 0 then 0 else d
pushBtn doorpos dir oldDir
| dir /= oldDir = oldDir
| dir /= 0 = 0
| doorpos == 5 = -1
| otherwise = 1
-- Exercise 3
numAdvance :: (Ord a, Num a) => Int -> ([a] -> Int)
numAdvance k = (\p -> length (filter (\e -> e > 0 && e >= p!!(k-1)) p))
-- Exercise 4
data BTree a = Nil | Node a (BTree a) (BTree a)
maximumLevel :: BTree Int -> Int
maximumLevel bt = biggestSum (treeHeight bt) bt 0 0
where
biggestSum _ Nil _ _ = 0
biggestSum 0 _ c ch = ch
biggestSum h d c ch = let ls = levelSum h d in biggestSum (h-1) d (max c ls) (if ls > c then h else ch)
treeHeight Nil = 0
treeHeight (Node a bt1 bt2) = 1 + max (treeHeight bt1) (treeHeight bt2)
levelSum 0 _ = 0
levelSum _ Nil = 0
levelSum 1 (Node a bt1 bt2) = a
levelSum d (Node a bt1 bt2) = levelSum (d-1) bt1 + levelSum (d-1) bt2
main :: IO()
main = do
print(prodEvens [1,2,3,4,5,6])
print(prodEvens [7.66,7,7.99,7])
print(controller "")
print(controller "..........")
print(controller "P....")
print(controller "P.P..")
print(controller "..P...O...")
print(controller "P......P......")
print(controller "P.P.P....")
print(controller ".....P.P........P....")
print(controller "..........")
print(controller "P..")
print(controller "P....")
print(controller "P......P......")
print(controller "P.P..")
print(controller "P.P.P....")
print(controller ".....P.P........P....")
print(controller ".....P......P.P..P....")
print(controller "P.O....")
print(controller "P......P.O....")
print(controller "P..OP..P..")
print(controller "P......P..OP..P...")
print(controller "..P...O.....")
print((numAdvance 5) [10, 9, 8, 7, 7, 7, 5, 5])
print((numAdvance 2) [0, 0, 0, 0])
print((numAdvance 3) [10, 9, 8, 7, 7, 7, 5, 5])
print((numAdvance 1) [10, 9, 8, 7, 7, 7, 5, 5])
print((numAdvance 2) [10, 9, 8, 7, 7, 7, 5, 5])
print((numAdvance 9) [5, 5, 5, 3, 3, 3, 0, 0, 0, 0])
print((numAdvance 10) [5, 5, 5, 3, 3, 3, 0, 0, 0, 0])
let t1 = Node 94 (Node 73 Nil (Node 80 Nil Nil)) (Node 87 (Node 73 Nil Nil) Nil)
let t2 = Node 94 (Node 73 Nil (Node 80 Nil Nil)) (Node 87 (Node 73 Nil Nil) (Node 7 Nil Nil))
let t3 = Node 94 (Node 0 Nil (Node 42 Nil Nil)) (Node 0 (Node 42 Nil Nil) (Node 42 Nil Nil))
print(maximumLevel t1)
print(maximumLevel t2)
print(maximumLevel t3)
|