Sha256: b30102fdfb98c9a28333adce9ab7f452cab2acaf8b09e11c361498cef39ec069

Contents?: true

Size: 1.26 KB

Versions: 13

Compression:

Stored size: 1.26 KB

Contents

module SimpleCipher

open System

let private letters = ['a'..'z']
let private keyLength = 100

let private random = System.Random()

let private generateKey() = 
    let numberOfLetters = List.length letters 
    Array.init keyLength (fun _ -> List.item (random.Next(numberOfLetters)) letters) 
    |> String
    
let private isInvalidKey key = Seq.length key = 0 || not (Seq.forall (fun c -> List.contains c letters) key)

let private modulo x y = ((x % y) + y) % y

let private charToInt (c:char) = (int c) - (int 'a')
let private intToChar (i:int) = (char)((int 'a') + (modulo i 26))

let private shiftChar operation key char = operation (charToInt char) (charToInt key) |> intToChar

let shift operation (key:string) (input:string) =
    input
    |> Seq.mapi (fun i c -> shiftChar operation key.[i % key.Length] c) 
    |> Seq.toArray
    |> String
    
let encode key input = shift (+) key input   
let decode key input = shift (-) key input

type SimpleCipher(key: string) =
    do 
        if isInvalidKey key then 
            invalidArg "key" "Invalid key"
    
    member __.Key with get() = key
    
    member __.Encode(plaintext: string) = encode key plaintext
    
    member __.Decode(ciphertext: string) = decode key ciphertext
    
    new() = SimpleCipher(generateKey())

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
trackler-2.2.1.180 tracks/fsharp/exercises/simple-cipher/Example.fs
trackler-2.2.1.179 tracks/fsharp/exercises/simple-cipher/Example.fs
trackler-2.2.1.178 tracks/fsharp/exercises/simple-cipher/Example.fs
trackler-2.2.1.177 tracks/fsharp/exercises/simple-cipher/Example.fs
trackler-2.2.1.176 tracks/fsharp/exercises/simple-cipher/Example.fs
trackler-2.2.1.175 tracks/fsharp/exercises/simple-cipher/Example.fs
trackler-2.2.1.174 tracks/fsharp/exercises/simple-cipher/Example.fs
trackler-2.2.1.173 tracks/fsharp/exercises/simple-cipher/Example.fs
trackler-2.2.1.172 tracks/fsharp/exercises/simple-cipher/Example.fs
trackler-2.2.1.171 tracks/fsharp/exercises/simple-cipher/Example.fs
trackler-2.2.1.170 tracks/fsharp/exercises/simple-cipher/Example.fs
trackler-2.2.1.169 tracks/fsharp/exercises/simple-cipher/Example.fs
trackler-2.2.1.167 tracks/fsharp/exercises/simple-cipher/Example.fs