Código: Seleccionar todo
import Data.List (elemIndices)
import Data.Char (toUpper)
vigenere :: String -> String -> String
vigenere [] _ = []
vigenere (x:xs)(y:ys)
|x == ' ' = ' ':vigenere xs ([y]++ys)
|y == ' ' = vigenere ([x]++xs) ys
|otherwise = ['a'..'z'] !! (foldl(+) 0 (concat[elemIndices (toUpper x)['A'..'Z'],elemIndices (toUpper y) ['A'..'Z']])`mod`26):vigenere xs (ys++[y])
desVigenere :: String -> String -> String
desVigenere [] _ = []
desVigenere (x:xs)(y:ys)
|x == ' ' = ' ':desVigenere xs ([y]++ys)
|y == ' ' = desVigenere ([x]++xs) ys
|otherwise = ['a'..'z'] !! (foldr(-) 0 (concat[elemIndices(toUpper x)['A'..'Z'],elemIndices(toUpper y)['A'..'Z']])`mod`26):desVigenere xs (ys++[y])
Código: Seleccionar todo
Strup@belistrup ~
$ ghci vigenere
WARNING: GHCi invoked via 'ghci.exe' in *nix-like shells (cygwin-bash, in particular)
doesn't handle Ctrl-C well; use the 'ghcii.sh' shell wrapper instead
GHCi, version 7.6.3: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main ( vigenere.hs, interpreted )
Ok, modules loaded: Main.
*Main> vigenere "con los dedos de las manos y los dedos de los pies los cojones y la polla todo suma veintitres" "beli strup"
"dsy tgl uyspw om dtj gposd g dhj xtesd lw efm ejid tgl tiyprpa q er jdmpl bgwf mjne gmagkcisid"
*Main>
*Main> desVigenere "dsy tgl uyspw om dtj gposd g dhj xtesd lw efm ejid tgl tiyprpa q er jdmpl bgwf mjne gmagkcisid" "beli strup"
"con los dedos de las manos y los dedos de los pies los cojones y la polla todo suma veintitres"
*Main>
podria haberlo hecho en dos lineas pero quise implementarle el quitado automatico de espacios en la clave y demas cosas para que quede como el mismisimo vigenere original, espero os guste el code un saludo