Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

laba2

.hs
Скачиваний:
15
Добавлен:
31.03.2021
Размер:
3.61 Кб
Скачать
import Data.Char
import Data.List
import Debug.Trace

-- 1а)Пароль содержит только двоичные цифры
checkPass1 :: [Char] -> Bool
checkPass1 [] = True
checkPass1 (x:xs)
| notElem x "01" = False
| otherwise = checkPass1 xs

-- 1б)Пароль заканчивается заглавной буквой
checkPass2 :: [Char] -> Bool
checkPass2 [x] = isUpper x
checkPass2 (_:xs) = checkPass2 xs


-- 2) Шифр цезаря
-- Кодирование
caesarEncode :: [Char] -> Int -> [Char]
caesarEncode [] _ = []
caesarEncode (x:xs) n
| isAlpha x = -- Если буква
if isLower x
then
chr (ord 'a' + mod (ord x - ord 'a' + n) 26) : caesarEncode xs n -- строчная
else
chr (ord 'A' + mod (ord x - ord 'A' + n) 26) : caesarEncode xs n -- заглавная
| otherwise = x : caesarEncode xs n

-- Декодирование
caesarDecode :: [Char] -> Int -> [Char]
caesarDecode x n = caesarEncode x (-n)


-- 3)
-- Римские цифры
romeDig :: Char -> Int
romeDig 'I' = 1
romeDig 'V' = 5
romeDig 'X' = 10
romeDig 'L' = 50
romeDig 'C' = 100
romeDig 'D' = 500
romeDig 'M' = 1000

romeToInt :: [Char] -> Int
romeToInt [x] = romeDig x
romeToInt (x:y:xs)
| romeDig x < romeDig y = romeToInt (y:xs) - romeDig x
| otherwise = romeToInt (y:xs) + romeDig x

-- 8 -> 10
octToDec [] = 0
octToDec (x:xs) = (digitToInt x) * (8^(length xs)) + (octToDec xs)

octMinusRome :: [Char] -> [Char] -> Int
octMinusRome a b =
octToDec a - romeToInt b
-- (trace ("octToDec: "++show (octToDec a)) (octToDec a)) - (trace ("RomeToDec: "++show (romeToInt b)) (romeToInt b))


-- 4)
-- D=(A\B)?(B\C)
getD :: [Integer] -> [Integer] -> [Integer] -> [Integer]
getD a b c =
(union (a \\ b) (b \\ c)) \\ (intersect (a \\ b) (b \\ c))


-- 5)
-- dd.mm -> информация об учебной неделе
weekInfo :: [Char] -> [Char]
weekInfo s
| m > 12 = error "Too big month's num"
| d > 31 = error "Too big day's num"
| (monthLens !! (m-1) < d) = error "There is no such day of the month"
-- формат МесяцДень (21.12 -> 1221, 02.09 -> 902)
| value >= 902 && value <= 1025 = "1 quarter"
| value >= 1026 && value <= 1104 = "autumn holidays"
| value >= 1105 && value <= 1227 = "2 quarter"
| value >= 1228 || value <= 111 = "winter holidays"
| value >= 112 && value <= 320 = "3 quarter"
| value >= 321 && value <= 329 = "spring holidays"
| value >= 330 && value <= 522 = "4 quarter"
| otherwise = "summer holidays"

where
d = read (take 2 s) :: Int
m = read (drop 3 s) :: Int
monthLens = [31,28,31,30,31,30,31,31,30,31,30,31]
value = m * 100 + d :: Int



main :: IO ()
main = do
putStrLn ("1a) 01110 is bin? = " ++ show (checkPass1 "01110"))
putStrLn (" 120000 is bin? = " ++ show (checkPass1 "120000"))
putStrLn ("1b) abcdE has last big char? = " ++ show (checkPass2 "abcdE"))
putStrLn (" AbCdeeeeRock has last big char? = " ++ show (checkPass2 "AbCdeeeeRock"))

putStrLn ("2)AbbA --5-> "
++ show(caesarEncode "AbbA" 5)
++ " --back-> "
++ show(caesarDecode (caesarEncode "AbbA" 5) 5))

putStrLn ("3) 2403(8) - MXLIII(Rome) = "
++ show(octMinusRome "2403" "MXLIII"))

putStrLn ("4) D = " ++ show (getD [3,5] [1,2,3,5] [1,2,4]))

putStrLn ("5) 29.12 = " ++ (weekInfo "29.12"))
putStrLn (" 09.07 = " ++ (weekInfo "09.07"))
putStrLn (" 11.11 = " ++ (weekInfo "11.11"))
Соседние файлы в предмете Функциональное и логическое программирование