f#中的凯撒密码

时间:2011-04-22 03:32:32

标签: f# encryption

我有一个项目,我必须编写一个Caesar密码,它接受一个字符串和一个移位量,然后将字符串加密成密文。我很容易在JavaScript中做到这一点,但现在我必须在F#中做到这一点。也没有循环只允许递归。我完全感到压力和困惑,时间不多了所以我作为最后的手段在这里张贴。这就是我到目前为止所做的一切,我觉得我正朝着一个完全错误的方向前进......

 let rec encrypt str shiftAmount =
if str.length > 0 then 
     strChar = str.ToUpper().Chars(0)
     strUni = int strChar
     strCoded = (((strUni + shiftAmount - 65) %26) +65)
else 

2 个答案:

答案 0 :(得分:0)

在这种情况下,使用映射函数(在本例中为Array.Map())和流水线而不是递归更有意义,因为您必须将函数(字符移位)应用于字符串中的每个字符。下面应该适用于大写字符:

let shift(c, shiftAmount) = 
     let num = int(c) - int('A')
     let offsetNum = (num+shiftAmount)%26
     let result = offsetNum + int('A')
     if offsetNum < 0 then
        char(int('Z') + offsetNum + 1)
     else
        char(offsetNum + int('A'))

let encrypt(str:string, shiftAmount) =
    str.ToCharArray() 
    |> Array.map (fun c -> shift( int(c), shiftAmount)) 
    |> String.Concat

可能有一个更优雅的解决方案(特别是涵盖时钟和逆时针转换),仍在学习自己。

答案 1 :(得分:0)

这是一个天真的凯撒编码:

let encode (str:string) shift =
    let inline flipzip a b = b, a
    str
    |> String.map (fun ch ->
        ch
        |> int
        |> flipzip (int 'A')
        ||> (-)
        |> (+) shift
        |> flipzip 26
        ||> (%)
        |> (+) (int 'A')
        |> char)

除此之外,我不清楚除了别人为你做的所有工作之外你要求的是什么......