module Exercise_12 where import Data.List (nub,sortBy) import Data.Ord (comparing) import System.IO 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 (s!!) $ strPrimes s ++ strNonPrimes s strNonPrimes s = filter (`notElem` strPrimes s) [0..length s-1] strPrimes = map pred . primes . length decrypt :: String -> String decrypt s = map fst $ sortBy (comparing snd) (f take ps ++ f drop (strNonPrimes s)) where f x = zip $ x (length ps) s ps = strPrimes s {-TTEW-}