Difference between revisions of "FP Solution"
Jump to navigation
Jump to search
Line 150: | Line 150: | ||
rp = filter (>= x) xs | rp = filter (>= x) xs | ||
in quicksort lp ++ [x] ++ quicksort rp | in quicksort lp ++ [x] ++ quicksort rp | ||
+ | |||
+ | oddList :: Int -> Int -> [Int] | ||
+ | oddList a b = [ x |x<-[a..b], odd x] | ||
+ | |||
+ | removeAllUpper :: String -> String | ||
+ | removeAllUpper xs = [ x |x<-xs, not (isUpper x)] | ||
+ | |||
+ | union :: Eq a => [a] -> [a] -> [a] | ||
+ | union xs ys = xs ++ [y| y<-ys, not (elem y xs)] | ||
+ | |||
+ | intersection :: Eq a => [a] -> [a] -> [a] | ||
+ | intersection xs ys = [y| y<-ys, elem y xs] | ||
+ | |||
+ | unique :: String -> String | ||
+ | unique n = reverse(tmp n "") where | ||
+ | tmp [] store = store | ||
+ | tmp (x:xs) store | x `elem` store = tmp xs store | ||
+ | | otherwise = tmp xs (x:store) | ||
+ | |||
+ | countThem :: String -> [(Char, Int)] | ||
+ | countThem xs = let u = unique xs | ||
+ | in [(x, length (filter (==x) xs)) |x<-u] | ||
+ | |||
+ | isPrime :: Int -> Bool | ||
+ | isPrime n = null [x |x<-[2..ceiling (sqrt (fromIntegral n)::Double)], n `mod` x == 0] | ||
+ | |||
+ | goldbach :: Int-> [(Int, Int)] | ||
+ | goldbach n = let primes = [x |x<-[2..(n `div` 2)+1], isPrime x] | ||
+ | in [(x,n-x) |x<-primes, isPrime (n-x)] | ||
+ | |||
+ | goldbachList :: Int -> Int-> Int -> [(Int, Int)] | ||
+ | goldbachList a b limit = filter (\(x,_)-> x>limit) [head (goldbach x) | x<-[a..b], even x] | ||
+ | |||
+ | combinations :: Int -> String -> [String] | ||
+ | combinations 1 xs = [[x]| x<-xs] | ||
+ | combinations n (x:xs) | n == length (x:xs) = [(x:xs)] | ||
+ | |otherwise = [[x] ++ y |y<-combinations (n-1) xs ] | ||
+ | ++ (combinations n xs) | ||
+ | |||
+ | not' :: Bool -> Bool | ||
+ | not' True = False | ||
+ | not' False = True | ||
+ | infixl 5 `not'` | ||
+ | |||
+ | and' :: Bool -> Bool -> Bool | ||
+ | and' True True = True | ||
+ | and' _ _ = False | ||
+ | infixl 4 `and'` | ||
+ | |||
+ | or' :: Bool -> Bool -> Bool | ||
+ | or' False False = False | ||
+ | or' _ _ = True | ||
+ | infixl 3 `or'` | ||
+ | |||
+ | nand' :: Bool -> Bool -> Bool | ||
+ | nand' x y = not' (and' x y) | ||
+ | infixl 4 `nand'` | ||
+ | |||
+ | xor' :: Bool -> Bool -> Bool | ||
+ | xor' x y = x/=y | ||
+ | infixl 3 `xor'` | ||
+ | |||
+ | impl' :: Bool -> Bool -> Bool | ||
+ | impl' True False = False | ||
+ | impl' _ _ = True | ||
+ | infixl 2 `impl'` | ||
+ | |||
+ | equ' :: Bool -> Bool -> Bool | ||
+ | equ' x y = x == y | ||
+ | infixl 7 `equ'` | ||
+ | |||
+ | tablen :: Int -> ([Bool] -> Bool) -> IO () | ||
+ | tablen n f = putStr(concat [show x ++ " -> " ++ show(f x) ++ "\n" |x<-allValues n]) where | ||
+ | allValues 1 = [[True], [False]] | ||
+ | allValues n = [x:y| x<-[True,False], y<-allValues (n-1)] | ||
+ | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<!-- | <!-- |
Revision as of 08:24, 30 October 2019
import Data.Char
fact1 :: Int -> Int
fact1 0 = 1
fact1 n = n * fact1 (n-1)
fact2 :: Int -> Int
fact2 n | n==0 = 1
| otherwise = n * fact2 (n-1)
fact3 :: Int -> Int
fact3 n = if n==0 then 1 else n * fact3 (n-1)
fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib n = tmp n 0 1 where
tmp 1 _ b = b
tmp x a b = tmp (x-1) b (a+b)
gcd' :: Int -> Int -> Int
gcd' a b | a > b = gcd' (a-b) b
| a < b = gcd' a (b-a)
| a==b = a
gcd2 :: Int -> Int -> Int
gcd2 a 0 = a
gcd2 a b = gcd2 b (a `mod` b)
isPrime :: Int -> Bool
isPrime 1 = False
isPrime y = isPrimeTest y (ceiling (sqrt (fromIntegral y)::Double))
where
isPrimeTest _ 1 = True
isPrimeTest n x | n `mod` x ==0 = False
| otherwise = isPrimeTest n (x-1)
length' :: [a] -> Int
length' [] = 0
length' (_:xs) = 1 + length' xs
sumIt :: [Int] -> Int
sumIt [] = 0
sumIt (x:xs) = x + sumIt xs
getHead :: [a] -> a
getHead (x:_) = x
getLast :: [a] -> a
getLast (x:xs) | length xs == 0 = x
| otherwise = getLast xs
isElement :: Eq a => a -> [a] -> Bool
isElement _ [] = False
isElement a (x:xs) | a == x = True
| otherwise = isElement a xs
getTail :: [a] -> [a]
getTail (_:xs) = xs
getInit :: [a] -> [a]
getInit [_] = []
getInit (x:xs) = x : getInit xs
combine :: [a] -> [a] -> [a]
combine [] y = y
combine (x:xs) y = x : combine xs y
max' :: [Int] -> Int
max' [x] = x
max' (x:y:z) | x > y = max' (x:z)
| otherwise = max' (y:z)
max2 :: [Int] -> Int
max2 (y:ys) = tmp y ys where
tmp a [] = a
tmp a (x:xs) | x > a = tmp x xs
|otherwise = tmp a xs
reverse' :: [a] -> [a]
reverse' [] = []
reverse' (x:xs) = (reverse' xs) ++ [x]
reverse'' :: [a] -> [a]
reverse'' n = tmp n []
where tmp [] ys = ys
tmp (x:xs) ys = tmp xs (x:ys)
take' :: Int -> [a] -> [a]
take' 0 _ = []
take' _ [] = []
take' n (x:xs) = x: take' (n-1) xs
drop' :: Int -> [a] -> [a]
drop' 0 x = x
drop' _ [] = []
drop' n (_:xs) = drop' (n-1) xs
minimum' :: Ord a => [a] -> a -- Is this right?
minimum' [x] = x
minimum' (x:y:z) | x < y = minimum' (x:z)
| otherwise = minimum' (y:z)
divisors :: Int -> [Int]
divisors n = tmp n where
tmp 0 = []
tmp x | n `mod` x == 0 = x: tmp (x-1)
| otherwise = tmp (x-1)
divisors' :: Int -> [Int]
divisors' n = filter (\x -> n `mod` x == 0) [1..n]
divisors'' :: Int -> [Int]
divisors'' n = [x | x<-[1..n], n `mod` x == 0]
zipThem:: [a] -> [b] -> [(a,b)]
zipThem (x:xs) (y:ys) = (x,y) : zipThem xs ys
zipThem _ _ = []
dotProduct :: [a] -> [b] -> [(a,b)]
dotProduct [] _ = []
dotProduct (x:xs) ys = tmp ys ++ dotProduct xs ys where
tmp [] = []
tmp (b:bs) = (x,b) : tmp bs
dotProduct' :: [a] -> [b] -> [(a,b)]
dotProduct' xs ys = [(x,y)|x<-xs, y<-ys]
dotProduct'' :: [a] -> [b] -> [(a,b)]
dotProduct'' x y =
zip (concat (map (replicate (length y)) x))
(concat (replicate (length x) y))
fibonacci :: Int -> Int
fibonacci n = fst (tmp n) where
fibStep (a,b) = (b,a+b)
tmp 0 = (0,1)
tmp x = fibStep (tmp (x-1))
allToUpper :: String -> String
allToUpper xs = [toUpper x |x<-xs]
allToUpper' :: String -> String
allToUpper' xs = map toUpper xs
quicksort :: (Ord a) => [a] -> [a]
quicksort (x:xs) = let lp = filter (< x) xs
rp = filter (>= x) xs
in quicksort lp ++ [x] ++ quicksort rp
oddList :: Int -> Int -> [Int]
oddList a b = [ x |x<-[a..b], odd x]
removeAllUpper :: String -> String
removeAllUpper xs = [ x |x<-xs, not (isUpper x)]
union :: Eq a => [a] -> [a] -> [a]
union xs ys = xs ++ [y| y<-ys, not (elem y xs)]
intersection :: Eq a => [a] -> [a] -> [a]
intersection xs ys = [y| y<-ys, elem y xs]
unique :: String -> String
unique n = reverse(tmp n "") where
tmp [] store = store
tmp (x:xs) store | x `elem` store = tmp xs store
| otherwise = tmp xs (x:store)
countThem :: String -> [(Char, Int)]
countThem xs = let u = unique xs
in [(x, length (filter (==x) xs)) |x<-u]
isPrime :: Int -> Bool
isPrime n = null [x |x<-[2..ceiling (sqrt (fromIntegral n)::Double)], n `mod` x == 0]
goldbach :: Int-> [(Int, Int)]
goldbach n = let primes = [x |x<-[2..(n `div` 2)+1], isPrime x]
in [(x,n-x) |x<-primes, isPrime (n-x)]
goldbachList :: Int -> Int-> Int -> [(Int, Int)]
goldbachList a b limit = filter (\(x,_)-> x>limit) [head (goldbach x) | x<-[a..b], even x]
combinations :: Int -> String -> [String]
combinations 1 xs = [[x]| x<-xs]
combinations n (x:xs) | n == length (x:xs) = [(x:xs)]
|otherwise = [[x] ++ y |y<-combinations (n-1) xs ]
++ (combinations n xs)
not' :: Bool -> Bool
not' True = False
not' False = True
infixl 5 `not'`
and' :: Bool -> Bool -> Bool
and' True True = True
and' _ _ = False
infixl 4 `and'`
or' :: Bool -> Bool -> Bool
or' False False = False
or' _ _ = True
infixl 3 `or'`
nand' :: Bool -> Bool -> Bool
nand' x y = not' (and' x y)
infixl 4 `nand'`
xor' :: Bool -> Bool -> Bool
xor' x y = x/=y
infixl 3 `xor'`
impl' :: Bool -> Bool -> Bool
impl' True False = False
impl' _ _ = True
infixl 2 `impl'`
equ' :: Bool -> Bool -> Bool
equ' x y = x == y
infixl 7 `equ'`
tablen :: Int -> ([Bool] -> Bool) -> IO ()
tablen n f = putStr(concat [show x ++ " -> " ++ show(f x) ++ "\n" |x<-allValues n]) where
allValues 1 = [[True], [False]]
allValues n = [x:y| x<-[True,False], y<-allValues (n-1)]