Цезарь шифр в ф # - PullRequest
       2

Цезарь шифр в ф #

0 голосов
/ 22 апреля 2011

У меня есть проект, в котором я должен кодировать шифр Цезаря, который принимает строку и величину сдвига, а затем зашифровывает строку в текст шифра.Я легко сделал это в 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 голосов
/ 22 апреля 2011

Вот наивная кодировка Цезаря:

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)

Кроме того, мне не ясно, о чем вы просите, кроме того, чтобы кто-то другой сделал всю работу за вас ...

0 голосов
/ 22 апреля 2011

В этом случае имеет больше смысла использовать функцию отображения (в данном случае 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

Возможно, существует гораздо более элегантное решение (особенно для охвата как сдвига по часовой стрелке, так и по часовой стрелке), все еще изучающее себя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...