-
Notifications
You must be signed in to change notification settings - Fork 40
/
class-03.hs
121 lines (104 loc) · 6.3 KB
/
class-03.hs
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
{-
Явная рекурсия в решениях хотя и допускается, но не приветствуется. Старайтесь обходиться стандартными
функциями, используя при этом создание функций «на лету». Пытайтесь максимально упростить уже написанные
решения, применяя подходящие функции из модуля Data.List и любых других модулей. Перед выполнением заданий
изучите примеры из лекции по функциям высшего порядка.
-}
-- 1. Простейшие задачи на применение функций map и filter.
-- 1.1 Преобразовать данный список целых чисел следующим образом:
-- a) увеличить все его элементы в два раза;
f11a :: Integral a => [a] -> [a]
f11a = map (\a -> 2*a)
-- b) увеличить все его элементы с четными значениями в два раза;
f11b:: Integral a => [a] -> [a]
f11b = map f
where
f x
| even x = 2*x
| otherwise = x
-- с) обнулить все его элементы с нечетными значениями;
f11c :: Integral a => [a] -> [a]
f11c = map f
where
f x
| odd x = 0
| otherwise = x
-- d) удалить из него элементы, большие заданного числа k;
f11d :: Integral a => a -> [a] -> [a]
f11d k = filter (\a -> a <= k)
-- e) отфильтровать его, оставив в списке только отрицательные числа;
f11e :: Integral a => [a] -> [a]
f11e = filter (\a -> a < 0)
-- f) удалить из него все положительные чётные числа.
f11f :: Integral a => [a] -> [a]
f11f = filter (\a -> a < 0 || odd a)
{-
1.2 Дан список декартовых координат точек на плоскости (пар вещественных чисел).
Преобразовать его следующим образом:
-}
-- a) отфильтровать список так, чтобы в нём остались точки из заданной координатной четверти;
sqfilt :: (Fractional a, Ord a, Integral b) => b -> [(a,a)] -> [(a,a)]
sqfilt q = filter (\a -> toq a == q)
where
toq (x, y)
| x > 0 && y > 0 = 1
| x < 0 && y > 0 = 2
| x < 0 && y < 0 = 3
| x > 0 && y < 0 = 4
| otherwise = 0
-- b) преобразовать декартовы координаты в полярные.
decToPolar :: (Eq a, Floating a, Ord a) => [(a,a)] -> [(a,a)]
decToPolar = map (\(x,y) -> (sqrt(x*x + y*y), angle x y))
where
angle x 0
| x < 0 = pi
| otherwise = 0
angle 0 y
| y > 0 = pi / 2
| otherwise = 3 * pi / 2
angle x y = atan(x/y)
{-
1.3 Дан список слов.
a) Преобразовать все слова к верхнему регистру.
b) Извлечь из него подсписок слов заданной длины.
c) Извлечь из него подсписок слов, начинающихся с заданной буквы.
-}
f13a :: [String] -> [String]
f13a = map undefined
{-
2. Формирование числовых последовательностей (iterate).
a) Список натуральных чисел, начиная с 0.
b) Список чётных чисел.
c) Список элементов последовательности: a_0=1, a_n=(1+a_{n-1})/2.
d) Список символов английского алфавита.
e) Список строк, представляющих n-значные двоичные числа.
-}
nats :: [Integer]
nats = iterate undefined 0
{-
3. Группировка списков.
a) Дан список символов. Сгруппировать подряд идущие символы по принципу: цифры — не цифры — ...
b) Дан список пар вещественных чисел (координат точек на плоскости). Сгруппировать подряд идущие
координаты точек, лежащие в одной координатной четверти.
c) Дан список и ненулевое натуральное число n. Разбить список на подсписки длиной n каждый.
Последний подсписок может содержать менее n элементов.
d) Дан список и ненулевые натуральные числа n и m. Разбить список на перекрывающиеся подсписки
длиной n элементов со сдвигом относительно предыдущего подсписка на m элементов.
e) Дан список. Определить длину самого длинного подсписка, содержащего подряд идущие одинаковые элементы.
-}
f3d :: [a] -> Int -> Int -> [[a]]
f3d xs n m = undefined
-- Должно быть True
test_f3d = f3d [1..10] 4 2 == [[1,2,3,4],[3,4,5,6],[5,6,7,8],[7,8,9,10],[9,10]]
{-
4. Разные задачи.
a) Дан текст в виде строки символов, содержащий среди прочего числовые данные. Посчитать количество
всех упоминающихся в тексте чисел.
b) Найти сумму всех чисел Фибоначчи, удовлетворяющих заданному предикату, в указанном промежутке
(например: все чётные от 1 до 106).
c) Дана строка текста и число n. Сформировать список, содержащий n самых часто используемых
в строке символов.
d) Дан список чисел. Сформировать список локальных максимумов исходного списка. Локальным максимумом
называется элемент, больший своих соседей.
e) Дан список. Продублировать все его элементы.
-}