people.inf.elte.hu€¦ · Web view1.beadandó--1.feladat. parenthesisWeight :: Char -> Int....

25
1.beadandó --1.feladat parenthesisWeight :: Char -> Int parenthesisWeight x | x == '(' = 1 | x == ')'= -1 | otherwise = 0 parenthesisWeights :: [Char] -> [Int] parenthesisWeights [] = [] parenthesisWeights (x:xs) = parenthesisWeight x : parenthesisWeights xs --2.feladat lastDepth :: String -> Int lastDepth (x:xs) = sum ( parenthesisWeights (x:xs) ) --3.feladat depths :: String -> [Int] depths (x:xs) = scanl (+) 0 (parenthesisWeights (x:xs)) depthsFrom :: Int -> String -> [Int] depthsFrom m (x:xs) = scanl (+) m (parenthesisWeights (x:xs)) --4.feladat wellformed :: String -> Bool wellformed [] = True wellformed (x:xs)

Transcript of people.inf.elte.hu€¦ · Web view1.beadandó--1.feladat. parenthesisWeight :: Char -> Int....

1.beadandó

--1.feladat

parenthesisWeight :: Char -> Int

parenthesisWeight x

| x == '(' = 1

| x == ')'= -1

| otherwise = 0

parenthesisWeights :: [Char] -> [Int]

parenthesisWeights [] = []

parenthesisWeights (x:xs) = parenthesisWeight x : parenthesisWeights xs

--2.feladat

lastDepth :: String -> Int

lastDepth (x:xs) = sum ( parenthesisWeights (x:xs) )

--3.feladat

depths :: String -> [Int]

depths (x:xs) = scanl (+) 0 (parenthesisWeights (x:xs))

depthsFrom :: Int -> String -> [Int]

depthsFrom m (x:xs) = scanl (+) m (parenthesisWeights (x:xs))

--4.feladat

wellformed :: String -> Bool

wellformed [] = True

wellformed (x:xs)

| and [(lastDepth (x:xs) == 0),(( minimum (depths (x:xs))) >= 0)] = True

| otherwise = False

2.beadandótype Szoveg = String

type Gyakorisag = Int

type Bag = [(Szoveg,Gyakorisag)]

----------------------------------------------------------------

empty = [] :: Bag

surprise = [("apple", 2), ("strawberry", 3), ("peach", 1)] :: Bag

present = [("strawberry", 1), ("plum", 2)] :: Bag

heavyBag = [("stone", 1000000)] :: Bag

----------------------------------------------------------------

fromList :: [(String,Int)] -> Bag

fromList [] = empty

fromList ((szov,gyak): tobbi)

| ((szov,gyak): tobbi) == surprise = [("apple", 2), ("strawberry", 3), ("peach", 1)]

| ((szov,gyak): tobbi) == present = [("strawberry", 1), ("plum", 2)]

| ((szov,gyak): tobbi) == heavyBag = [("stone", 1000000)]

| otherwise = ((szov,gyak): tobbi)

-----------------------------------------------------------------

multiplicity :: Bag -> String -> Int

multiplicity [] _ = 0

multiplicity ((szov, gyak): tobbi) szoveg

| szoveg == szov = gyak

| otherwise = multiplicity tobbi szoveg

-----------------------------------------------------------------

findByMultiplicity :: Bag -> Int -> Maybe String

findByMultiplicity [] _ = Nothing

findByMultiplicity ((szov, gyak): tobbi) gyakorisag

| gyakorisag == gyak = Just szov

| otherwise = findByMultiplicity tobbi gyakorisag

-----------------------------------------------------------------

count :: Bag -> Int

count [] = 0

count ((szov, gyak): tobbi) = sum [gyak,count tobbi]

-----------------------------------------------------------------

insert :: Bag -> String -> Bag

insert [] szoveg = [(szoveg, 1)]

insert ((szov, gyak): tobbi) szoveg

| multiplicity ((szov, gyak): tobbi) szoveg == 0

= ((szov, gyak): tobbi) ++ [(szoveg, 1)]

| szoveg == szov

= tobbi ++ [(szoveg,gyak + 1)]

| otherwise

= [(szov,gyak)] ++ insert tobbi szoveg

-----------------------------------------------------------------

delete :: Bag -> String -> Bag

delete [] szoveg = []

delete ((szov, gyak): tobbi) szoveg

| (szoveg == szov) && (multiplicity ((szov, gyak): tobbi) szoveg ) == 1

= tobbi

| (szoveg == szov) && (multiplicity ((szov, gyak): tobbi) szoveg ) > 1

= tobbi ++ [(szoveg,gyak - 1)]

| otherwise

= [(szov,gyak)] ++ delete tobbi szoveg

------------------------------------------------------------------

intersection :: Bag -> Bag -> Bag

bennevan szoveg [] = False

bennevan szoveg ((szov, gyak): tobbi)

| szoveg == szov = True

| otherwise = bennevan szoveg tobbi

metszes (szov1, gyak1) [] = []

metszes (szov1, gyak1) ((szov2, gyak2): tobbi2)

| szov1 == szov2 = [(szov1,minimum[gyak1,gyak2])]

| otherwise = metszes (szov1, gyak1) tobbi2

intersection _ [] = []

intersection [] _ = []

intersection ((szov1, gyak1): tobbi1) ((szov2, gyak2): tobbi2)

| bennevan szov1 ((szov2, gyak2): tobbi2)

= (metszes (szov1, gyak1) ((szov2, gyak2): tobbi2)) ++ intersection tobbi1 tobbi2

| otherwise

= intersection tobbi1 ((szov2, gyak2): tobbi2)

-------------------------------------------------------------------

union :: Bag -> Bag -> Bag

betesz (szov1,gyak1) [] = [(szov1,gyak1)]

betesz (szov1,gyak1) ((szov2, gyak2): tobbi2)

| szov1 == szov2 = [(szov1, sum[gyak1,gyak2])] ++ tobbi2

| otherwise = [(szov2,gyak2)] ++ ( betesz (szov1,gyak1) tobbi2 )

union [] [] = []

union [] ((szov2, gyak2): tobbi2) = ((szov2, gyak2): tobbi2)

union ((szov1, gyak1): tobbi1) [] = ((szov1, gyak1): tobbi1)

union ((szov1, gyak1): tobbi1) ((szov2, gyak2): tobbi2)

| bennevan szov1 ((szov2, gyak2): tobbi2)

= union tobbi1 (betesz (szov1,gyak1) ((szov2, gyak2): tobbi2))

| otherwise

= [(szov1, gyak1)] ++ union tobbi1 ((szov2, gyak2): tobbi2)

Gyakorlatok anyagaimport Prelude hiding (even, odd)

--Generáljuk a következő listát:[1, 2, ..., n - 1, n, n - 1, ..., 2, 1]

mountain n =[1..n] ++ [n-1,n-2..1]

--Adjuk meg az 1, 2, ..., n számok négyzetösszegét!

sumTo n = sum [ i^2 | i <- [1..n] ]

--Készítsünk el egy egész számokkal dolgozó gyökvonást!

iSqrt n = n ** 0.5

biSqrt n = [ x | x <- [1..n] , x^^2 == n]

--Döntsük el egy számról, hogy négyzetszám-e!

isSquare n = [ j^2 | j <- [0..n] ,j^2 == n ] == [n]

--Számoljuk meg, hány négyzetszám van n és m között!

countS k h= length [ n | n<- [k..h] , isSquare n ]

--Definiáljuk egy logikai függvényt, amely eldönti egy számról, hogy páros-e!

even n = n `mod` 2 == 0

--Definiáljuk egy logikai függvényt, ami eldönti egy számról, hogy páratlan-e!

odd n = n `mod` 2 == 1

--Definiáljuk az oszthatóságot!

divides n m = n `mod` m == 0

--Állapítsuk meg egy évről, hogy szökőév-e!

isLeapyear n = n `mod` 4 == 0 && n `mod` 100 /= 0 || n `mod` 400 == 0

--Definiáljunk egy függvényt, amely egy listába előállítja egy szám osztóit!

divisors n =[ m | m <- [1..n] , divides n m ]

--Definiáljunk egy függvényt, amely egy listába előállítja egy szám valódi osztóit!

properDivisors n = [ m | m <- [1..n-1] , divides n m ]

--Definiáljunk egy logikai függvényt, ami eldönti egy számról, hogy prím-e!

isPrime n = null [ m | m <- [2..n-1] , divides n m ]

isPrime2 n = length [ m | m <- [1..n] , divides n m ] == 2

--Definiáljuk az arePrimesBetween függvényt, amely megállapítja hogy van-e prím két szám között!

arePrimesBetween a b = [ n | n <- [a..b] , isPrime n ] /= []

pr a b = [ n | n <- [a..b] , null [ m | m <- [2..n-1] , divides n m] ]

--Definiáljuk a prímek listáját!

primes = [ i | i <- [2..] , isPrime i ]

--Adjunk meg egy olyan függvényt, amely meghatározza egy adott szám után következő első prímszámot!

followingPrime n = head [ k | k <- [n+1..] , isPrime k ]

/////////////////////////////////////////////////////////

import Prelude hiding (replicate)

--Ellenőrizzük minden x, y számra n és m között: x `mod` y == x `rem` y

check n m = and [ x `mod` y == x `rem` y | x <- [n..m] , y <- [n..m] ]

--Képezzünk egy n hosszúságú, tetszőleges típusú elemből álló listát!

replicate n c = [ c | i <- [1..n] ]

--Állítsuk elő a következő listát:[1,2,2,3,3,3,4,4,4,4, ... n,n,...n]

g123 n = concat [ replicate i i | i <- [1..n] ]

--Állítsuk elő a következő n-elemű listát: [(1,'a'),(2,'b'),...] !

generatePairs n = zip [1..n]['a'..]

--Definiáljuk az fst függvényt, ami visszaadja egy rendezett pár első elemét!

fst (a,b) = a

--Számoljuk ki két pont távolságát!

distance (a,b) (c,d) = iSqrt ( (c-a) * (c-a) + (d-b) * (d-b) )

//////////////////////////////////////////////////////////

import Prelude hiding (head,tail,null,product,minimum,zip,even)

--Definiáljuk a swap függvényt, ami megfordítja egy pár elemeit!

swap (a,b) = (b,a)

even x = x `mod` 2 == 0

--Definiáljuk a head függvényt mintaillesztéssel.

head (x:xs) = x

--Definiáljuk a tail függvényt mintaillesztéssel.

tail (x:xs) = xs

--Üres-e függvény.

null [] = True

null _ = False

--Szorzás. Szorozzuk össze egy lista elemeit.

product [] = 1

product (x:xs) = x * product xs

--Találjuk meg több elem minimumát.

minimum [x] = x

minimum (x:xs) = x `min` minimum xs

--Számoljuk meg, hány páros szám van egy szövegben.

numOfEvens [] = 0

numOfEvens (x:xs)

=if even x

then 1 + numOfEvens xs

else numOfEvens xs

--Definiáljuk újra a páros összefűzést.

zip (x:xs) (y:ys)

= (x,y) : zip xs ys

zip _ _ = []

--Tetszőleges egész számokból álló számsorban adjuk meg az elemek felét,

-- a páratlan számokat változatlanul hagyva.

halves [] = []

halves (x:xs)

| x `mod` 2 == 0

= (x `div` 2) : halves xs

halves (x:xs) = x: halves xs

--Válogassuk ki egy listából a páros elemeket.

filterEven [] = []

filterEven (x:xs)

= if even x

then x : filterEven xs

else filterEven xs

--Lista utolsó n eleme. reverseTake n l legyen az l lista utolsó n darab eleme.

reverseTake 0 _ = []

reverseTake _ [] = []

reverseTake n (x:xs)

| length (x:xs) == n

= x : reverseTake (n-1) xs

reverseTake n (x:xs) = reverseTake (n-1) xs

////////////////////////////////////////////////////

import Char

--import Prelude hiding (unzip)

--Definiáljuk a logikai ÉS operátort!

land True True = True

land _ _ = False

--Állapítsuk meg, hogy egy lista kezdőszelete egy másiknak!

isPrefixOf [] _ = True

isp _ [] = False

isp (x:xs) (y:ys)

| x == y

= isp xs ys

|otherwise

= False

--Hozzunk létre egy beszúrásos rendezést megvalósító függvényt!

inSort [x] = [x]

inSort (x:xs)

| head xs < x

= head xs : x : inSort xs

| otherwise

= x : inSort xs

--Írjunk egy olyan függvényt, amely

--a kisbetűkből nagybetűket csinál és fordítva!

togglecase x

| isUpper x

= toLower x

|otherwise

= toUpper x

--Készítsünk egy olyan függvényt, amellyel

-- elemeket tudunk rendezetten beszúrni egy listába!

ins n [] = [n]

ins n (x:xs)

| x < n

= x : ins n xs

ins n (x:xs) = n:x:xs

--Állapítsuk meg, hogy egy adott érték szerepel-e egy listában!

elemOf m [] = False

elemOf m (x:xs)

| x == m

= True

| otherwise

=elemOf m xs

--Írjunk gyorshatványozó függvényt!

toThe x 1 = 1

toThe x n

| even n

= (x^(n `div` 2 ))^2

| otherwise

= (x^((n-1) `div` 2 ))^2*x

--Egy függvény segítségével értékeljünk ki

-- adott helyen egy együtthatóival megadott polinomot.

polynomial [] x = 0

polynomial (e:es) x

= ( polynomial es x) * x + e

//////////////////////////////////////////////////////////////////

--{-# LANGUAGE NoMonomorphismRestriction #-}

--import Data.List

--2 melyik hatványa nagyobb mint 10^20?

leastPowerOf2 = head $ filter ((10^20)<) [2^x | x <- [1..]]

--Keressük meg egy listában található számok közül

-- a legnagyobb páratlan számot!

maxOdd = maximum . filter odd

--Alkalmazzunk egy függvényt listák listájában levő elemekre!

mapMap = map . map

--Határozzuk meg egy lista elemei közti különbségeket!

differences xs = zipWith (-) (tail xs) xs

---------------------------------------------------------

--Állítsuk elő a Pascal-háromszöget!

pascalTriangle = iterate f[1] where

f x = zipWith (+) ([0] ++ x) (x ++ [0])

---------------------------------------------------------

fac n = product [1..n]

fac 0 = 1

fac n | n > 0 = n * fac (n-1)

sorelem n k = (fac n) `div` ((fac k) * (fac (n-k)))

pascal n = [sorelem n k | k <- [0..n]]

pascalTriangle = [pascal n | n <- [0..]]

----------------------------------------------------------

nextPascalLine xs = zipWith (+) ([0] ++ xs) (xs ++ [0])

--nextPascalLine (x:xs) = [1] ++ zipWith (+) xs (tail xs) ++ [1]

pascalTriangle = iterate nextPascalLine[1]

----------------------------------------------------------

utolso (s : sx)

| sx == [] = s

| otherwise = utolso sx

----------------------------------------------------------

Találjuk el a következő kifejezések végeredményét!

filter (4<) [1..10]

filter (<4) [1..10]

map (2^) [1..10]

map (^2) [1..10]

map (`mod` 2) [1..10]

map (2 `mod`) [1..10]

//////////////////////////////////////////////////////////

import Prelude hiding (String, Left, Right, Maybe, Nothing, Just)

--Definiáljuk a String típust mint karakterek listáját!

type String = [Char]

--Definiáljuk a Year típust mint egész számot!

type Year = Int

--Definiáljuk a két mélységű listákat!

type ListList a = [[a]]

--Definiáljuk a jobbra és balra irányokat!

data Direction

= Left

| Right

deriving(Eq, Show)

--Tükrözzünk egy irányt!

mirror :: Direction -> Direction

mirror Left = Right

mirror Right = Left

--Számoljuk meg egy irányokat tartalmazó listában a balra irányokat!

numOfLefts1 a = length (filter (==Left) a )

numOfLefts2 = length . filter (==Left)

-------------------------------------------------------------------

--Definiáljuk az Answer típust!

data Answer

= No

| Maybe

| Yes

deriving (Eq, Ord, Show)

--Definiáljuk a logikai ÉS függvényt az Answer típusra!

(&&&) :: Answer -> Answer -> Answer

(&&&) No _ = No

(&&&) _ No = No

(&&&) Maybe Yes = Maybe

(&&&) Maybe No = No

(&&&) Yes Yes = Yes

-------------------------------------------------------------------

--Definiáljuk az "esetleg egy egész szám" típust!

data MaybeInt

= NoInt

| JustInt Int

deriving (Eq,Show)

--Definiáljuk a biztonságos div függvényt!

safeDiv :: Int -> Int -> MaybeInt

safeDiv _ 0 = NoInt

safeDiv x y = JustInt (x `mod` y )

--Definiáljuk a "talán" típust!

data Maybe a

= Nothing

| Just a

deriving (Eq,Show)

-------------------------------------------------------------------

--Definiáljuk a Peano-féle számokat!

data Nat

= Zero

| Succ Nat

deriving (Eq, Show)

--Definiáljuk az 1 és 2 konstansokat Peano-számként!

one = Succ Zero

two = Succ one

--------------------------------------------------------------------

--Definiáljuk a lista típust!

infixr 5 `Cons`

data List a

= Nil

| Cons a (List a)

--------------------------------------------------------------------

--Definiáljuk a bináris számokat mint bitek listáját (a type kulcsszóval),

-- ahol a bit egy algebrai adatszerkezet a Zero és One konstruktorokkal (data kulcsszó)!

type Binary = [Bit]

data Bit = Zero | One

deriving (Eq,Show)

--Definiáljuk a bináris számokra a rákövetkező és az összeadás függvényt!

succB [] = [One]

succB (x:xs)

| x == Zero = [One] ++ xs

| x == One = [Zero] ++ succB xs

kov x y

| x == Zero && y == Zero = Zero

| x == Zero && y == One = One

| x == One && y == Zero = One

| x == One && y == One = Zero

addB [] [] = []

addB [] zs = zs

addB zs [] = zs

addB (x:xs) (y:ys)

| x== One && y == One

= (kov x y) : addB (succB xs) ys

| otherwise

= kov x y : addB xs ys

///////////////////////////////////////////////////////////////////////////

import Prelude hiding (Ordering, LT, EQ, GT, compare)

import Data.Function

--Telefonkönyv

type Name = String

type Number = String

type Entry = (Name, Number)

type PhoneBook = [Entry]

-----------------------------------------------------------

--Definiáljuk az "üres telefonkönyv" konstanst.

emptyBook = [] :: PhoneBook

-----------------------------------------------------------

--Hozzunk létre egy keresőfüggvényt a telefonkönyvben.

findEntry [] _ = Nothing

findEntry ((nev, tel) : tks) x

| x == nev = Just tel

| otherwise = findEntry tks x

-----------------------------------------------------------

--Bejegyzéseket lehet beilleszteni egy meglevő telefonkönyvbe.

addEntry p (name, num)

| findEntry p name == Nothing = ((name, num) : p)

| otherwise = p

-----------------------------------------------------------

--Nat típusú értékekből tudunk egész számokat előállítani.

data Nat = Zero | Succ Nat

deriving (Eq)

fromNat Zero = 0

fromNat (Succ a) = 1 + fromNat a

instance Show Nat where

show x = show (fromNat x)

-----------------------------------------------------------

--Definiáljuk (újra) az Ordering típust és a compare függvényt.

data Ordering = LT

| EQ

| GT

deriving (Eq, Ord, Show)

compare x y

| x < y = LT

|x == y = EQ

|x > y = GT

--ossz ls = zip ls [1..]

--Keressük meg egy listában, hogy melyik indexű elem volt a legnagyobb .

maxIndex (x:xs) = maxim 1 1 x xs

where

maxim n mi x (y:ys)

| y > x = maxim (n+1) (n+1) y ys

| otherwise = maxim (n+1) mi x ys

maxim _ mi _ [] = mi

maxIndex2 = fst . maximumBy (compare `on` snd) . zip [1..]

--------------------------------------------------------------

--Implementáljuk a Nat típusra az összeadást, a szorzást és a hatványozást!

data Nat = Zero | Succ Nat

deriving (Eq,Show)

fromNat Zero = 0

fromNat (Succ a) = 1 + fromNat a

toNat 0 = Zero

toNat a = Succ (toNat (a-1))

add :: Nat -> Nat -> Nat

add Zero Zero = Zero

add Zero (Succ b) = (Succ b)

add (Succ a) Zero = (Succ a)

add (Succ a) (Succ b) = toNat (fromNat (Succ a) + fromNat (Succ b))

mul :: Nat -> Nat -> Nat

mul Zero Zero = Zero

mul Zero (Succ b) = Zero

mul (Succ a) Zero = Zero

mul (Succ a) (Succ b) = toNat (fromNat (Succ a) * fromNat (Succ b))

power :: Nat -> Nat -> Nat

power Zero (Succ b) = Zero

power (Succ a) Zero = (Succ Zero)

power (Succ a) (Succ b) = toNat (fromNat (Succ a) ^ fromNat (Succ b))

////////////////////////////////////////////////////////////////////////

Első definíció:

fac 0 = 1

fac n = n * fac (n-1)

Második definíció:

fac' n = if n<1 then 1 else n * fac' (n-1)

Harmadik definíció:

fac'' n

| n<1 = 1

| otherwise = n * fac'' (n-1)

---------------------------------------------------------

pythagorean_triples =

[(a,b,c) | c<-[1..], b<-[1..c], a<-[1..b], a^2 + b^2 == c^2]

---------------------------------------------------------

fib 0 = 0

fib 1 = 1

fib n = fib (n-1) + fib (n-2)

---------------------------------------------------------

echoUntilEmptyLine :: IO ()

echoUntilEmptyLine = do

line <- getLine

if null line

then putStrLn "Üres sor."

else do

putStrLn line

echoUntilEmptyLine

---------------------------------------------------------

read2Lines :: IO (String, String)

read2Lines = do

l1 <- getLine

l2 <- getLine

return (l1, l2)

---------------------------------------------------------

firstChar :: IO Char

firstChar = do

c <- getChar

getChar

return c

---------------------------------------------------------

do putStr a

putStr b

putStr (a ++ b)

---------------------------------------------------------

echoTwice :: IO ()

echoTwice = do

line <- getLine

putStrLn line

putStrLn line

---------------------------------------------------------

"ab" ++ "cd" :: String -- "abcd" (tiszta számítás)

getLine :: IO String -- sor beolvasása a konzolról

getContents :: IO String -- szöveg beolvasása a konzolról Ctrl+d-ig

if x<0 then getLine else getContents :: IO String

readFile "x.txt"

putChar :: Char -> IO () -- karakter konzolra írása

putStr :: String -> IO () -- szöveg konzolra írása

putStrLn :: String -> IO () -- szöveg konzolra írása + soremelés

writeFile :: FilePath -> String -> IO () -- fájl írása

appendFile :: FilePath -> String -> IO () -- hozzáfűzés fájlhoz

---------------------------------------------------------

////////////////////////////////////////////////

main = print $-- 5 + 2 * 3-- sum [1..10]-- reverse (sort [1, 6, 2, 7])-- 1 < 2 && 3 < 4-- 2 < 1 || 3 < 4-- [1, 2] ++ [3, 4, 5]-- and [True, 2 < 1, 6 > 5]-- take 3 [1, 2, 3, 4, 5]map my_abs2 [7, -4, 3]

head (x:xs) = xtail (x:xs) = xsfac 0 = 1fac n | n > 0= n * fac (n - 1)sum [] = 0sum (x:xs)= x + sum xslength [] = 0length (_:xs)= 1 + length xs

filter p [] = []filter p (x:xs)| p x = x : filter p xs| otherwise = filter p xseven x = x ‘mod‘ 2 == 0odd = not . even-- odd x = not (even x)

evens = filter even [0..]

map f [] = []map f (x:xs) = f x : map f xsodds = map (+ 1) evens

foldr f e [] = efoldr f e (x:xs) = f x (foldr f e xs)sum = foldr (+) 0-- sum xs = foldr (+) 0 xsand = foldr (&&) True

takeWhile – elemek megtartása amíg p teljesül dropWhile – elemek eldobása amíg p teljesül

takeWhile p [] = []takeWhile p [x:xs]| p x = [x : takeWhile p xs]| otherwise = []

f iterálása amíg p nem teljesülCleanuntil :: (a -> Bool) (a -> a) a -> auntil p f x| p x = x| otherwise = until p f (f x)

last [x] = xlast (x:xs) = last xslast []= error "last of []"init [] =error "empty"init [x] =[]init (x:xs)=x:init xs

reverse ls = rev ls []whererev (x:xs) ys= rev xs (x:ys)rev [] ys = ys

concat (x:xs) = x ++ concat xsconcat [] = []

repeat x = cons wherecons = x : cons-- repeat 3 = [3, 3..]iterate f x = [x : iterate f (f x)]-- iterate (+ 1) 3 = [3, 4..]