Summary Files Commits Branches @commit @diff @stats
path: root / Year 2 / Functional Programming / hw3.hs
blob: de81bd50a80a158c377490c237b6a1f898aa67fe (plain) (blame)
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)