0votos

Cifrado César en F#

por nicolocodev hace 3 años

Solución en F# haciendo uso del String map, los chars como codigos UTF-16(decimal) (http://www.fileformat.info/info/charset/UTF-16/list.htm) y el pattern match del lenguaje. Las vocales con tildes y la ñ y Ñ quedan intactas

Implementar funciones para el cifrado César (cifrado por desplazamiento, código de César o desplazamiento de César)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
open System 
 
//AZ estan en 65..90 
//az estan en 97..122 
let tildes = [225;233;237;243;250] 
 
let cifrar frase n = 
    frase |> String.map(fun x ->  
            match x with 
            | y when tildes |> List.exists(fun x -> x = int y) -> y 
            | y when y = 'ñ' || y = 'Ñ' -> y             
            | y when Char.IsLetter y ->  
                match x with  
                | y when Char.IsUpper y ->  
                    let v = int y 
                    if(v+n <= 90) then  
                        y + char n 
                    else  
                        char (((v+n)-90)+64) 
                | y when Char.IsLower y ->  
                    let v = int y 
                    if(v+n <= 122) then  
                        y + char n 
                    else  
                        char (((v + n) - 122) + 96) 
                |_ -> y 
            | _ -> x) 
             
let decifrar frase n = 
    frase |> String.map(fun x ->  
            match x with 
            | y when tildes |> List.exists(fun x -> x = int y) -> y 
            | y when y = 'ñ' || y = 'Ñ' -> y             
            | y when Char.IsLetter y ->  
                match x with  
                | y when Char.IsUpper y ->  
                    let v = int y 
                    if(v-n >= 65) then  
                        y + char -n 
                    else  
                        char ((91+(v - n)) - 65) 
                | y when Char.IsLower y ->  
                    let v = int y 
                    if(v-n >= 97) then  
                        y + char -n 
                    else  
                        char ((123+(v - n)) - 97) 
                |_ -> y 
            | _ -> x) 
 
[<EntryPoint>] 
let main args =  
    let cifrado = cifrar "¡Hola Mundo! ¿Cómo estás?... Te habla Iñaqui" 5     
    printfn "%s" cifrado 
    let decifrado = decifrar cifrado 5 
    printfn "%s" decifrado 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.