Advertisement
Guest User

Untitled

a guest
Apr 21st, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.91 KB | None | 0 0
  1. import Data.List
  2. import Data.Function
  3.  
  4. type Castka = Integer
  5.  
  6. data Operace
  7. = Prihlaseni
  8. | Odhlaseni
  9. | Vyber Castka
  10. | Pripis Castka
  11. deriving (Show, Read, Eq)
  12.  
  13. type Cas = Integer
  14.  
  15. type Uzivatel = String
  16.  
  17. data Zaznam =
  18. Zaznam Cas
  19. Uzivatel
  20. Operace
  21. deriving (Show, Read, Eq)
  22.  
  23. type Zaznamy = [Zaznam]
  24.  
  25. main = do
  26. log <- (map read . lines <$> readFile "banka.log") :: IO [Zaznam] --nacteni a rozparsovani logu
  27. let result cmt f --pomocna funkce na vypisovani vysledku
  28. = do
  29. putStrLn (cmt ++ ":")
  30. print (f log)
  31. putChar '\n'
  32. {- pocitani a vypisovani vysledku zacina zde -}
  33. result
  34. "DEMO -- jmeno prvniho uzivatele v souboru se smichanymi zaznamy"
  35. demoPrvniZaznam
  36.  
  37. result "Seznam uzivatelu serazenych podle abecedy" serazeniUzivatele
  38. result "Casy top 10 nejvetsich vyberu" top10vyber
  39. result "Jmena uzivatelu 10 nejmensich pripisu" top10pripis
  40. result "Nejaktivnejsi uzivatel" topUzivatel
  41. result "Uzivatel ktery vydelal nejvic penez" topPrirustek
  42. result "Prumerna vybrana castka uzivatelu zacinajicich od J" prumerVyberuJ
  43. result
  44. "Uzivatel s nejdelsi posloupnosti akci nerusenou v logu jinymi uzivateli"
  45. nejdelsiSingleRun
  46. result
  47. "Pocet vyberu pri kterych uzivatele s 5-pismennymi jmeny nebyli prokazatelne prihlaseni"
  48. neprihlaseneVybery
  49.  
  50. {- Priklad -}
  51. demoPrvniZaznam :: Zaznamy -> Uzivatel
  52. demoPrvniZaznam (Zaznam _ jm _:_) = jm
  53.  
  54. {- Ukol zacina tady. Misto `undefined` dodejte definice funkci, ktere z logu
  55. - vytahnou pozadovany vysledek. -}
  56. serazeniUzivatele :: Zaznamy -> [Uzivatel]
  57. serazeniUzivatele (list) = sort(nub( map (\(Zaznam _ jm _) -> jm ) list))
  58.  
  59. top10vyber :: Zaznamy -> [(Cas, Castka)]
  60. top10vyber(list) =
  61. take 10 (reverse (sortBy (compare `on` snd)
  62. (zip
  63. (pouzeCas list)
  64. (map( \(Vyber cena) -> cena) (filter jeVyber (pouzeOperace list))))))
  65.  
  66. top10pripis :: Zaznamy -> [(Uzivatel, Castka)]
  67. top10pripis (list) = take 10 (sortBy (compare `on` snd) (zip
  68. (pouzeJmeno list)
  69. (map (\(Pripis castka) -> castka) (filter jePripis (pouzeOperace list)))))
  70.  
  71. topUzivatel :: Zaznamy -> [(Int, Uzivatel)]
  72. topUzivatel (list) = take 1 (reverse(sortBy (compare `on` fst) (frequency(pouzeJmeno list))))
  73.  
  74. topPrirustek :: Zaznamy -> [(Integer, Uzivatel)]
  75. topPrirustek (list) = take 1 (reverse (sortBy (compare `on` fst) (zip (map (`vydelek` list) (serazeniUzivatele list)) (serazeniUzivatele list))))
  76.  
  77. -- prumer vyberu spocitejte zaokrouhleny dolu
  78. prumerVyberuJ :: Zaznamy -> [(Integer, Uzivatel)]
  79. prumerVyberuJ list = undefined
  80.  
  81. nejdelsiSingleRun :: Zaznamy -> Uzivatel
  82. nejdelsiSingleRun = undefined
  83.  
  84. neprihlaseneVybery :: Zaznamy -> Integer
  85. neprihlaseneVybery = undefined
  86.  
  87.  
  88. -- Pomocne funkce
  89. jeVyber :: Operace -> Bool
  90. jeVyber (Vyber _) = True
  91. jeVyber _ = False
  92.  
  93. pouzeOperace :: Zaznamy -> [Operace]
  94. pouzeOperace (list) = map ( \(Zaznam _ _ operace) -> operace) list
  95.  
  96. pouzeCas :: Zaznamy -> [Cas]
  97. pouzeCas (list) = map ( \(Zaznam cas _ _) -> cas) list
  98.  
  99. pouzeJmeno :: Zaznamy -> [Uzivatel]
  100. pouzeJmeno (list) = map ( \(Zaznam _ uzivatel _) -> uzivatel) list
  101.  
  102. jePripis :: Operace -> Bool
  103. jePripis (Pripis _) = True
  104. jePripis _ = False
  105.  
  106. frequency :: Ord a => [a] -> [(Int,a)]
  107. frequency list = map (\l -> (length l, head l)) (group (sort list))
  108.  
  109. pouzeOperaceJmena :: Uzivatel -> Zaznamy -> [Operace]
  110. pouzeOperaceJmena uzivatel list = [operace | (Zaznam _ uzivatel1 operace ) <- list, uzivatel == uzivatel1]
  111.  
  112. sectiVyber :: [Operace] -> Integer
  113. sectiVyber list = sum( map ( \(Vyber castka) -> castka) list ) * (-1)
  114.  
  115. sectiPripis :: [Operace] -> Integer
  116. sectiPripis list = sum( map ( \(Pripis castka) -> castka) list )
  117.  
  118. vydelek :: Uzivatel -> Zaznamy -> Integer
  119. vydelek uzivatel list =
  120. let pripisy = filter jePripis (pouzeOperaceJmena uzivatel list)
  121. vybery = filter jeVyber (pouzeOperaceJmena uzivatel list)
  122. in sectiVyber(vybery) + sectiPripis(pripisy)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement