Summary Files Commits Branches @commit @diff @stats
path: root / Year 2 / Functional Programming
diff options
context:
space:
mode:
Commitefbc9d2a15ac6d21caf9cb87e7e913e35f48e391 (patch)
Author
 Syndamia <kamen@syndamia.com>
2023-01-14 18:24:51 +0200
Committer
 Syndamia <kamen@syndamia.com>
2023-01-14 18:24:51 +0200
Files6dbe12c1e6be8d52f8f40b5445cb378ba5eb9a5b /Year 2/Functional Programming
uni-projects-efbc9d2a15ac6d21caf9cb87e7e913e35f48e391.tar
uni-projects-efbc9d2a15ac6d21caf9cb87e7e913e35f48e391.tar.gz
uni-projects-efbc9d2a15ac6d21caf9cb87e7e913e35f48e391.zip
Parentb4a0a8843c9fcde60ffdce36a474e08ebc7dcd6a (diff)
[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.hs88
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)