Página 1 de 1

Cifrado cesar - haskell

Publicado: 22 Dic 2013, 20:43
por sanko
Gracias a overxfl0w que me estuvo ayudando con la recursividad de haskell pude acabar el cifrado:

Código: Seleccionar todo

import Data.Char

xEnc x y = ['a'..'z'] !! (((x + y) `mod` 26 ))
xDec x y = ['a'..'z'] !! (((x - y) `mod` 26 ))

encFinal :: String -> Int -> String
encFinal [] y = ""
encFinal (x:xs) y = (xEnc ((ord x)-97) y):(encFinal xs y)

decFinal :: String -> Int -> String
decFinal [] y = ""
decFinal (x:xs) y = (xDec ((ord x)-97) y):(decFinal xs y)
Saludos.
PD : Over, maquina

Re: Cifrado cesar - haskell

Publicado: 22 Dic 2013, 23:52
por strup
me gusta el codigo aunque no lo consiga comprender por mas que lo lea, por cierto de lujo un saludo

Re: Cifrado cesar - haskell

Publicado: 26 Feb 2014, 18:01
por sanko
Dejo aqui una pequeña mejora, se aprovechan mejor las intensionales:

Código: Seleccionar todo

module Cesar where
	import Data.Char
	xEnc :: String -> Int -> String
	xEnc z y = [chr ((ord x + y) `mod` 256) | x <- z]

	xDec :: String -> Int -> String
	xDec z y = [chr ((ord x - y) `mod` 256) | x <- z]

Re: Cifrado cesar - haskell

Publicado: 26 Mar 2014, 20:47
por strup
aqui va mi alternativa

Código: Seleccionar todo

import Data.Char (isSpace,toUpper)
import Data.List (elemIndices)

cesar [] ys = []
cesar (x:xs) ys |isSpace x = x:cesar xs ys |otherwise = [['a'..'z'] !!(((elemIndices (toUpper x) ['A'..'Z']!! 0)+ys) `mod` 26)]++cesar xs ys

dCesar [] ys = []
dCesar (x:xs) ys |isSpace x = x:dCesar xs ys |otherwise = [['a'..'z'] !!(((elemIndices (toUpper x) ['A'..'Z']!! 0)-ys) `mod` 26)]++dCesar xs ys
pastebin:[Enlace externo eliminado para invitados]

Muestra:

Código: Seleccionar todo

Strup@belistrup ~
$ ghci cesar
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             ( cesar.hs, interpreted )
Ok, modules loaded: Main.
*Main> putStrLn.cesar "beli strup" $ 29
ehol vwuxs
*Main>
*Main> putStrLn.dCesar "ehol vwuxs" $ 29
beli strup
espero os guste el code un saludo
PD: Buena tu mejora sanko

Re: Cifrado cesar - haskell

Publicado: 26 Mar 2014, 23:02
por strup
Bueno ya que sanko mejoro la suya yo tambien me anime y la mejore un poco bastante

Código: Seleccionar todo

import Data.Char (isSpace,toUpper)
import Data.List (elemIndices)

cesar xs ys = foldr (\x -> \y -> if isSpace x then x:y else ['a'..'z'] !! (((elemIndices (toUpper x) ['A'..'Z']!! 0)+ys)`mod` 26):y)[] xs
dcesar xs ys = foldr (\x -> \y -> if isSpace x then x:y else ['a'..'z'] !! (((elemIndices (toUpper x) ['A'..'Z']!! 0)-ys)`mod` 26):y)[] xs
pastebin: [Enlace externo eliminado para invitados]

Muestra:

Código: Seleccionar todo

"ghci>" :load "cesar.hs"
[1 of 1] Compiling Main             ( cesar.hs, interpreted )
Ok, modules loaded: Main.
"ghci>" putStrLn.cesar "beli Strup" $ 29
ehol vwuxs
"ghci>" putStrLn.dcesar "ehol vwuxs" $ 29
beli strup
esta vez hice uso de las lambdas y de la funcion de pliegue foldr para que asi me saliese en una sola linea
un Saludo foro