diff options
[FP/E2] Added work from second exam
1 files changed, 88 insertions, 0 deletions
| -rw-r--r-- | Year 2/Functional Programming/Exam-14.01.2023.hs | 88 |
diff --git a/Year 2/Functional Programming/Exam-14.01.2023.hs b/Year 2/Functional Programming/Exam-14.01.2023.hs new file mode 100644 index 0000000..51a769a --- /dev/null +++ b/Year 2/Functional Programming/Exam-14.01.2023.hs @@ -0,0 +1,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) |
