-- 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)