und nochmal in Haskell ...
Code:
import Char
import List
caesar :: String -> (Int, Int) -> String
caesar [] (_, _) = []
caesar (x:xs) (shift, dec) = enc : caesar xs (shift, dec)
where
enc = [ 'A'..'Z'] !! (mod (ord x - 65 + (dec * shift)) 26)
vigenere :: String -> String -> (Int, Int) -> String
vigenere [] _ (_, _) = []
vigenere (x:xs) ks (idx, dec) = enc : vigenere xs ks (newIdx, dec)
where
alph = [ 'A'..'Z']
newIdx = mod (idx + 1) (length ks)
enc = alph !! (mod (ord x - 65 + (dec * (shift (ks !! idx, 0)))) 26)
shift (k, i) = if i > 25 then 1 else if alph !! i == k then i else shift (k, i+1)
main :: IO()
main = do
putStrLn $ "FELIX -> " ++ caesar "FELIX" (3, 1)
putStrLn $ "IHOLA -> " ++ caesar "IHOLA" (3, -1)
putStrLn $ "GEHEIMNIS -> " ++ vigenere "GEHEIMNIS" "AKEY" (0, 1)
putStrLn $ "GOLCIWRGS -> " ++ vigenere "GOLCIWRGS" "AKEY" (0, -1) Gruß
Felix