elm/exercises/atbash-cipher/AtbashCipher.example
2016-06-19 17:37:52 -04:00

63 lines
1.3 KiB
Text

module AtbashCipher exposing (..)
import String
import Dict
import Char
import Regex exposing (HowMany(All), regex)
encode : String -> String
encode plain =
let
translate =
toTranslator alphabet reversedAlphabet
in
plain
|> String.toLower
|> String.filter (\c -> Char.isLower c || Char.isDigit c)
|> String.map translate
|> insertEvery 5 " "
decode : String -> String
decode cipher =
let
translate =
toTranslator reversedAlphabet alphabet
in
cipher
|> String.filter ((/=) ' ')
|> String.map translate
alphabet : String
alphabet =
"abcdefghijklmnopqrstuvwxyz"
reversedAlphabet : String
reversedAlphabet =
-- AKA tebahpla
String.reverse alphabet
toTranslator : String -> String -> Char -> Char
toTranslator from to =
let
table =
List.map2 (,) (String.toList from) (String.toList to)
|> Dict.fromList
translate key =
Dict.get key table
|> Maybe.withDefault key
in
translate
insertEvery : Int -> String -> String -> String
insertEvery size insertion string =
Regex.replace All
(regex (".{" ++ toString size ++ "}(?!$)"))
(\{ match } -> match ++ insertion)
string