module Exercise_12 where import Data.List (nub, (\\), sortBy) import Data.Ord (comparing) 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 = ns isPrime ++ ns (not . isPrime) where ns f = fst $ unzip $ filter (f . snd) $ zip s [1..] decrypt :: String -> String decrypt e = fst $ unzip $ sortBy (comparing snd) $ zip e p ++ zip (drop (length p) e) ([1..l] \\ p) where l = length e p = filter isPrime [1..l] {-TTEW-}