module Exercise_12 where import Data.List 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 as = let ps = primes $ length as in [ as !! (i - 1) | i <- ps ++ ([1 .. length as] \\ ps) ] decrypt :: String -> String decrypt as = let ps = primes $ length as in [ c | (_, c) <- sortOn fst (zip [ i - 1 | i <- ps ++ ([1 .. length as] \\ ps) ] as) ] {-TTEW-}