aboutsummaryrefslogtreecommitdiff
path: root/semestr-3/pf/lista8/test/app/Main.hs
blob: 79c89fdc8079b14300c91e8287adc84e36ea27de (plain)
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
-- module Main where

silnia :: (Eq p, Num p) => p -> p
silnia n = if n == 0 then 1 else n * silnia (n -1)

fibs :: [Integer]
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

-- Zadanie 1

f :: [Integer] -> [Integer]
f (p : xs) = filter (\x -> x `mod` p /= 0) xs

primes :: [Integer]
primes = map head (iterate f [2 ..])

-- Zadanie 2

primes' :: [Integer]
primes' = 2 : [p | p <- [3 ..], all (\q -> p `mod` q /= 0) (takeWhile (\q -> q * q <= p) primes')]

-- Zadanie 3

permi :: [a] -> [[a]]
permi [] = [[]]
permi (x : []) = [[x]]
permi (p : xs) = concat [(iter [] perm) | perm <- permi xs]
  where
    iter pref [] = [pref ++ [p]]
    iter pref suf = (pref ++ (p : suf)) : (iter (pref ++ [head suf]) (tail suf))

perms :: [a] -> [[a]]
perms [] = [[]]
perms (x : []) = [[x]]
perms xs = iter [] [] xs
  where
    iter res pref [] = res
    iter res pref (x : xs) = iter (res ++ (map (\ys -> x : ys) (perms (pref ++ xs)))) (pref ++ [x]) xs

-- Zadanie 4

sublist :: [a] -> [[a]]
sublist [] = [[]]
sublist (x : xs) = sxs ++ (map (\xs -> x : xs) sxs)
  where
    sxs = sublist xs

-- Zadanie 5

qsortBy :: (a -> a -> Bool) -> [a] -> [a]
qsortBy _ [] = []
qsortBy _ [x] = [x]
qsortBy cmp (x : xs) = le ++ [x] ++ ge
  where
    le = qsortBy cmp [y | y <- xs, cmp x y]
    ge = qsortBy cmp [y | y <- xs, cmp y x]

-- Zadanie 6

-- subtable :: [a] -> Int -> [b] -> ([a] -> [a]) -> [a]
-- subtable [] _ _ _ = []
-- subtable _ _ [] _ = []
-- subtable xs maxLen ys f = getSubtableBounded (f (take maxLen xs)) ys
--   where
--     getSubtableBounded [] _ = []
--     getSubtableBounded _ [] = []
--     getSubtableBounded (x : xs) (_ : ys) = x : (getSubtableBounded xs ys)

-- natsBounded xs = iter [] 1 xs
--   where
--     iter res _ [] = res
--     iter res num (x : xs) = iter (res ++ [num]) (num + 1) xs

-- generateCantorTable :: [a] -> [b] -> ([a] -> [a]) -> [a]
-- generateCantorTable _ [] f = []
-- generateCantorTable [] _ f = []
-- generateCantorTable xs ys f = concat [subtable xs maxLen ys f | maxLen <- natsBounded xs]

-- (><) :: [a] -> [b] -> [(a, b)]
-- (><) xs ys = zip (generateCantorTable xs ys reverse) (generateCantorTable ys xs id)

-- (><) :: [a] -> [b] -> [(a, b)]
-- (><) [] _ = []
-- (><) _ [] = []
-- (><) xs ys = iterXS xs ys
--   where iterXS xs ys

-- Zadanie 7

data Tree a = Node (Tree a) a (Tree a) | Leaf

data Set a = Fin (Tree a) | Cofin (Tree a)

treeFromList :: Ord a => [a] -> Tree a
treeFromList [] = Leaf
treeFromList [x] = Node Leaf x Leaf
treeFromList xs =
  let center xs =
        let iter pref crawl [] = (pref, crawl)
            iter pref crawl [x] = (pref, crawl)
            iter pref crawl (x : y : xs) = iter (head crawl : pref) (tail crawl) xs
         in iter [] xs xs
   in let (st, nd) = center xs in Node (treeFromList (reverse st)) (head nd) (treeFromList (tail nd))

setFromList :: Ord a => [a] -> Set a
setFromList xs = Fin (treeFromList xs)

setEmpty :: Ord a => Set a
setEmpty = Fin Leaf

setFull :: Ord a => Set a
setFull = Cofin Leaf

setToList :: Ord a => Set a -> [a]
setToList (Fin t) = treeToList t
setToList (Cofin t) = treeToList t

treeToList :: Ord a => Tree a -> [a]
treeToList Leaf = []
treeToList (Node t1 a t2) = treeToList t1 ++ [a] ++ treeToList t2

merge :: Ord a => [a] -> [a] -> [a]
merge [] ys = ys
merge xs [] = xs
merge (x : xs) (y : ys) = if x < y then x : (merge xs (y : ys)) else y : (merge (x : xs) ys)

setUnion :: Ord a => Set a -> Set a -> Set a
setUnion (Fin t1) (Fin t2) =
  setFromList (treeToList t1 `merge` treeToList t2)
setUnion (Fin t1) (Cofin t2) =
  Cofin (treeFromList [x | x <- treeToList t2, x `notElem` treeToList t1])
setUnion (Cofin t1) (Fin t2) = setUnion (Fin t2) (Cofin t1)
setUnion (Cofin t1) (Cofin t2) =
  Cofin (treeFromList [x | x <- treeToList t1, x `elem` treeToList t2])

setIntersection :: Ord a => Set a -> Set a -> Set a
setIntersection (Fin t1) (Fin t2) =
  setFromList [x | x <- treeToList t1, x `elem` treeToList t2]
setIntersection (Fin t1) (Cofin t2) =
  setFromList [x | x <- treeToList t1, x `notElem` treeToList t2]
setIntersection (Cofin t1) (Fin t2) =
  setIntersection (Fin t1) (Cofin t2)

-- setIntersection (Cofin t1) (Cofin t2) =
--   Cofin (treeFromList [x | x <- treeToList t1, ])

treeMember :: Ord a => a -> Tree a -> Bool
treeMember _ Leaf = False
treeMember x (Node t1 y t2) =
  (x == y) || if x < y then treeMember x t1 else treeMember x t2

setMember :: Ord a => a -> Set a -> Bool
setMember x (Cofin t) = not (x `treeMember` t)
setMember x (Fin t) = x `treeMember` t