module Exercise_12 where import Data.List (nub, delete) isPrime :: Int -> Bool isPrime n | n <= 1 = False | otherwise = primeAux (n-1) where primeAux 1 = True primeAux i = n `mod` i /= 0 && primeAux (i-1) -- returns all primes up to the passed number primes :: Int -> [Int] primes n = [i | i<-[2..n], isPrime i] {-WETT-} encrypt :: String -> String encrypt s = map (\p -> s!!(p-1)) (ps ++ foldr delete [1..n] ps) where n = length s ps = primes n decrypt :: String -> String decrypt cs = reverse $ decryptAux n n (length $ primes n) where n = length cs decryptAux 0 _ _ = "" decryptAux l taken acc | isPrime l = cs!!(acc-1):decryptAux (l-1) taken (acc-1) | otherwise = cs!!(taken-1):decryptAux (l-1) (taken-1) acc {-TTEW-}