Página 1 de 1

Cifrado Vigenere [Haskell]

Publicado: 22 Mar 2014, 01:50
por strup
que decir, un code precioso

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])
Muestra:

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>
pastebin:[Enlace externo eliminado para invitados]
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