Advertisement
Guest User

Untitled

a guest
Oct 21st, 2019
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.05 KB | None | 0 0
  1. {- SPOP. Lab 1. Nieoceniane -}
  2.  
  3. import Data.Char -- funkcje 'ord' i 'chr' do zadania 5.
  4.  
  5. {- Zadanie 1. Napisz funkcję, która zwraca środkowy element podanej listy
  6. (zakładając jej nieparzystą długość). Wykorzystaj funkcje standardowe:
  7. 'div' i 'length' oraz operator (!!). Przykład:
  8.  
  9. ghci> middle "Haskell"
  10. 'k'
  11. -}
  12.  
  13. middle :: [a] -> a
  14. middle xs = if odd listLength
  15. then xs !! (listLength `div` 2)
  16. else error "List must have odd length"
  17. where listLength = length xs
  18.  
  19. {- Zadanie 2. Napisz funkcję, która usuwa z listy występujące bezpośrednio
  20. po sobie duplikaty danego elementu. Nie korzystaj z funkcji standardowych.
  21. Przykład:
  22.  
  23. ghci> removeDuplicates [9, 3, 3, 3, 4, 5, 5, 3, 5]
  24. [9,3,4,5,3,5]
  25.  
  26. Wskazówka: spójrz na definicję funkcji 'maximum' z wykładu. -}
  27.  
  28. removeDuplicates :: Eq a => [a] -> [a]
  29. removeDuplicates [] = []
  30. removeDuplicates [x] = [x]
  31. removeDuplicates (x:y:ys) | x == y = removeDuplicates (x : ys)
  32. | otherwise = x : removeDuplicates (y : ys)
  33.  
  34.  
  35. {- Zadanie 3. Napisz funkcję, która wstawia do danej listy nowy element
  36. na podanej pozycji. Nie korzystaj z funkcji standardowych. Przykład:
  37.  
  38. ghci> insertAt "askell" 'H' 0
  39. "Haskell"
  40.  
  41. Wskazówka: por. z definicją operatora (!!) z wykładu
  42. -}
  43.  
  44. insertAt :: [a] -> a -> Int -> [a]
  45. insertAt xs element 0 = element : xs
  46. insertAt (x:xs) element n = x : insertAt xs element (n - 1)
  47.  
  48. {- Zadanie 4. Napisz funkcję, która usuwa z listy wszystkie występujące
  49. dalej duplikaty poszczególnych elementów. Przykład:
  50.  
  51. ghci> removeAllDuplicates [9, 3, 3, 3, 4, 5, 5, 3, 5]
  52. [9,3,4,5]
  53.  
  54. Wskazówka: spójrz na definicję funkcji 'reverse' z wykładu. W akumulatorze
  55. przechowuj elementy napotykane po raz pierwszy. Użyj funkcji 'elem' do
  56. sprawdzenia, czy element jest już w akumulatorze. -}
  57.  
  58. removeAllDuplicates :: Eq a => [a] -> [a]
  59. removeAllDuplicates [] = []
  60. removeAllDuplicates xs = rest xs []
  61. where rest [] acc = acc
  62. rest (x:xs) acc = if x `elem` acc
  63. then rest xs acc
  64. else rest xs (acc ++ [x])
  65.  
  66.  
  67. {- Zadanie 5. Zadanie dotyczy szyfrowania tekstów. Prosty kod Cezara polega
  68. na tym, że w miejsce danej litery wstawiamy literę o kodzie większym np.
  69. o 3 (liczbę tę nazywamy kluczem w kodzie Cezara). Końcowe litery alfabetu
  70. zastępujemy literami z początku alfabetu. Np. w miejsce ‘A’ wstawiamy ‘D’,
  71. w miejsce ‘X’ wstawiamy ‘A’. Napisz dwie funkcje, które odpowiednio kodują
  72. i dekodują napis szyfrem Cezara o podanym kluczu. Przykład:
  73.  
  74. ghci> codeCezar "Koty" 3
  75. "Nrwb"
  76. ghci> decodeCezar "Nrwb" 3
  77. "Koty"
  78.  
  79. Wskazówka: kod ASCII danego znaku zwraca funkcja ord :: Char -> Int, natomiast
  80. znak odpowiadający podanemu kodowi ASCII zwraca funkcja chr :: Int -> Char.
  81. Przykład:
  82.  
  83. ghci> ord 'A'
  84. 65
  85. ghci> chr 65
  86. 'A' -}
  87.  
  88. codeCezar :: String -> Int -> String
  89. codeCezar [] _ = []
  90. codeCezar (x:xs) shift = let alphaNums = length [startPosition..endPosition]
  91. startPosition = if isLower x
  92. then 'a'
  93. else 'A'
  94. endPosition = if isLower x
  95. then 'z'
  96. else 'Z'
  97. normalizedShift = shift `mod` alphaNums
  98. newPosition = let newPositionOverflowed = ord x + normalizedShift
  99. difference = if newPositionOverflowed > (ord endPosition)
  100. then alphaNums - 1
  101. else 0
  102. in newPositionOverflowed - difference
  103. in (chr newPosition) : (codeCezar xs shift)
  104.  
  105. decodeCezar :: String -> Int -> String
  106. decodeCezar [] _ = []
  107. decodeCezar l shift = codeCezar l (25-shift)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement