Funkcionális programozás gyakorlat

8. feladatsor

Beadandó feladat

Definiálj prímfaktorizáló függvényt:

factors :: Integer -> [Integer]

A függvény növekvő sorrendben sorolja fel a szám prímtényezőit, multiplicitással.

factors 1000        ↦   [2,2,2,5,5,5]
factors 1234567890 ↦ [2,3,3,5,3607,3803]

Feladat

Állítsd elő egy lista összes prefixét.

inits :: [a] -> [[a]]
inits [1,2,3]   ↦  [[],[1],[1,2],[1,2,3]]

Feladat

Készíts párokat egy lista szomszédos elemeiből.

pairs :: [a] -> [(a, a)]
pairs [3,45,2,1]    ↦   [(3,45),(45,2),(2,1)]

Feladat

Egy szövegben számold meg, hány szó kezdődik azzal a betűvel, amelyikkel az előző végződött.

wordCont :: String -> Int
wordCont "ab ba aa ba"2

Feladat

Találd meg elemek listájának minimumát.

minimum :: Ord a => [a]{-véges, nemüres-} -> a
true  = minimum [3,4,1,2]   ==  1

Feladat

Készítsd el egy listából az elemet megelőző elemek maximumának listáját.

maximums :: Ord a => [a] -> [a]
maximums [1,3,2,8,0]    ↦   [1,3,3,8,8]

Feladat

Add meg egy lista összes részlistáját.

sublists :: [a] -> [[a]]
sublists "abcd"
↦ ["a","ab","b","abc","bc",
"c","abcd","bcd","cd","d"]
sublists [1..]
↦ [[1],[1,2],[2],[1,2,3],[2,3],[3], ...]

Feladat

Add meg egy lista összes adott hosszúságú részlistáját, illetve adott számnál nem hosszabb részlistáit.

subListWithLength :: Int -> [a] -> [[a]]
subListWithMaxLength :: Int -> [a] -> [[a]]
subListWithLength 3 "eiaou"
↦ ["eia","iao","aou"]
subListWithMaxLength 3 "eiaou"
↦ ["e","ei","eia","i","ia","iao",
"a","ao","aou","o","ou","u"]

Feladat

Add meg a listában leggyakrabban előforduló karaktert.

mostFrequentChar :: String -> Char
mostFrequentChar "abrakadabra"'a'

Feladat

Keresd meg egy szöveg egyik leghosszabb szavát.

longestWord :: String -> String

Feladat

Keresd meg egy koordinátákkal adott pontsorozatban az origóhoz legközelebbi pontot.

closestToOrigo :: Real a => [(a, a)] -> (a, a)

Feladat

Állítsd elő a következő sorozatot:

0,1,0,-1,0,1,2,1,0,-1,-2,-1,0,1,2,3,2,1,0,-1,...
sequence010 :: [Int]

Feladat

Állítsd elő azt a listát, amely a természetes számokat tartalmazza a négyzetszámok elhagyásával.

natWithoutSquares :: [Int]
natWithoutSquares !! 999  ==  1032
natWithoutSquares !! 99999 == 100316

Feladat

Keressük meg azokat az a, b, c logikai értékeket, amelyekre teljesül az alábbi képlet.

(a || b && c) /= ((a || b) && c)

A megoldás legyen könnyen átírható tetszőleges képletre, amely tetszőleges számú változót tartalmazhat.

Feladat

Állítsd elő a következő végtelen szöveget:

"* ** *** **** *****...".

stars :: String

Feladat

  1. Állítsd elő a [(0,10),(1,9),...,(10,0)] listát.
  2. Sorold fel a természetes számpárokat az alábbi sorrendben.
[(0,0),(0,1),(1,0),(0,2),(1,1),(2,0), ...]

Feladat

Add vissza azt a listát, amely a megkapottól abban tér el, hogy a megadott elem nem szerepel benne.

delete :: Eq a => a -> [a] -> [a]

Feladat

Számold kis sok egymás utáni szám különbségét.

differences :: Num a => [a] -> [a]
differences [1,4,5,6]    ↦    [3,1,1]

Feladat

Állítsunk elő egy n*n-es sakktáblát mint logikai értékek listájának listáját és szövegesen is.

boolChessTable :: Int -> [[Bool]]
chessTable :: Int -> [String]
boolChessTable 4   ↦    [[True, False, True, False]
,[False, True, False, True]
,[True, False, True, False]
,[False, True, False, True]]

chessTable 4 ↦ [ " x x"
, "x x "
, " x x"
, "x x "]

Feladat

Adott listából válaszd le az elemeket egy adott tulajdonságot nem teljesítő elemig (az elemmel bezárólag).

takeWhileNext :: (a -> Bool) -> [a] -> [a]
takeWhileNext even [2,4,6,7,8]  ↦  [2,4,6,7]
takeWhileNext even [7,8] ↦ [7]
takeWhileNext even [6,8] ↦ [6,8]

Feladat

Állapítsd meg, hogy egy lista utótagja-e egy másiknak.

isSuffixOf :: Eq a => [a]{-véges-} -> [a]{-véges-} -> Bool

Igaz:

"alma" `isSuffixOf` "alma"
"alma" `isSuffixOf` "vadalma"

Nem igaz:

"alma" `isSuffixOf` "almafa"
"alma" `isSuffixOf` "alm"

Feladat

Definiáld két lista rendezett összefésülését. A két lista elejéről mindig a kisebb elemet választjuk következőnek.

sortMerge :: Ord a => [a] -> [a] -> [a]
sortMerge [1,2,8] [3,4,10]  ↦  [1,2,3,4,8,10]
sortMerge [] [3,4,10] ↦ [3,4,10]