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
|
-- Задача 1
generate :: [Int] -> [Int] -> [[Int]]
generate as bs = asiter as bs (head as)
where
asiter [] _ _ = []
asiter as bs minm
| head as < minm = asiter (tail as) bs minm
-- Минаваме през всеки елемент от as и строим всички редици, които започват с него
| otherwise = bsiter as bs (head as) ++ asiter (tail as) bs (head as)
bsiter _ [] _ = []
bsiter as bs minm
| head bs < minm = bsiter as (tail bs) minm
-- Минаваме през всеки елемент от bs и строим редици
-- Първият елемент, започващ с as и сегашния bs
| otherwise = [[head as, head bs]]
-- Всички редици, които започват с [as, bs], тоест строим всички възможни редици без сегашните глави на as и bs
++ (map (\x -> [head as, head bs] ++ x) (asiter (tail as) (tail bs) (head bs)))
-- Следващ елемент от bs
++ bsiter as (tail bs) (head bs)
-- Задача 2
countUniques :: String -> Int
countUniques f = foldr (\el accum -> accum + (countUniquesLine el)) 0 (lines f)
-- Пропускаме всичко до "|" (включително), преобразуваме стринговете в дължини, оставяме само тези,
-- които отговарят на желаните цифри (1, 4, 7, 8) и бройм
countUniquesLine :: String -> Int
countUniquesLine inpt = length (filter (\v -> elem v [2, 3, 4, 7]) (map length (drop 11 (words inpt))))
main :: IO()
main = do
print(generate [10, 15, 25] [1, 5, 20, 30])
sample <- readFile "sample.txt"
print(countUniques sample)
inpt <- readFile "input.txt"
print(countUniques inpt)
|