-- Задача 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)