Skip to content

Instantly share code, notes, and snippets.

@bstack
Created September 28, 2016 11:39
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bstack/e7f0d7edeef56266e9b959ff639491e8 to your computer and use it in GitHub Desktop.
Save bstack/e7f0d7edeef56266e9b959ff639491e8 to your computer and use it in GitHub Desktop.
open System
let resolveEncryptedLetter (letterToEncrypt:char, keywordLetter) =
let alphabet = "abcdefghijklmnopqrstuvwxyz"
alphabet.Split [| keywordLetter |]
|> Array.rev
|> Array.append [| keywordLetter |> string |]
|> Array.reduce (+)
|> Seq.toArray
|> fun rowOrderedByKeywordLetter
-> rowOrderedByKeywordLetter, alphabet
|> Seq.toArray
|> Array.findIndex (fun letter -> letter.Equals(letterToEncrypt))
|> fun (rowOrderedByKeywordLetter, letterToEncryptIndex) -> Array.get rowOrderedByKeywordLetter letterToEncryptIndex
|> fun keywordAlphabet -> keywordAlphabet.ToString()
let buildKeywordText messageToEncrypt (keyWord:char[]) =
Seq.fold (fun (messageCharIndex:int, keywordText:string) element ->
messageCharIndex % keyWord.Length
|> fun keywordCharIndex -> (messageCharIndex + 1, keywordText + keyWord.[keywordCharIndex].ToString())) (0,"") messageToEncrypt
|>
snd
let encryptMessage(keyWord:string, messageToEncrypt:string) =
let keyWordText = keyWord |> Seq.toArray |> buildKeywordText messageToEncrypt
Seq.fold (fun (counter:int, result:string) letterToEncrypt ->
counter + 1, result + resolveEncryptedLetter(letterToEncrypt, keyWordText.[counter])) (0, "") messageToEncrypt
|> snd
printfn "Ans %A" (encryptMessage ("scones", "meetmebythetree"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment