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

laba2

.hs
Скачиваний:
21
Добавлен:
31.03.2021
Размер:
4 Кб
Скачать
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"))
Соседние файлы в предмете Функциональное и логическое программирование