defmodule CaesarCipher do @moduledoc """ Documentation for `CaesarCipher`. """ @caesar_map ~w/A B C D E F G H I J K L M N O P Q R S T U V W X Y Z/ @alphabet_lenght 26 @doc """ This function encrypt a string with the salt specified. ## Examples Encrypt iex> CaesarCipher.encrypt("HELLO WORLD", 2) "JGNNQ YQTNF" """ def encrypt(word, salt) do run(String.split(String.upcase(word), ""), salt, :+, []) end @doc """ This function decrypt a string with the salt specified. ## Examples Decrypt iex> CaesarCipher.decrypt("JGNNQ YQTNF", 2) "HELLO WORLD" """ def decrypt(word, salt) do run(String.split(String.upcase(word), ""), salt, :-, []) end defp convertToString([""], _, _, result) do List.to_string(result) end defp run([h | t], salt, operator, result) do index = Enum.find_index(@caesar_map, fn n -> n == h end) replacement = if index do adjustment = apply(Kernel, operator, [index, salt]) Enum.at(@caesar_map, rem(adjustment, @alphabet_lenght)) else h end if t == [""] do convertToString(t, salt, operator, result ++ [replacement]) else run(t, salt, operator, result ++ [replacement]) end end end