2017-09-24 15 views
2

我一直在從Dave Thomas的Programming in Elixir開始練習。我遇到了一個寫一個函數(出於某種原因稱爲caesar),它需要一個charlist和一個整數來添加到charlist中的每個元素,如果它經過'z'循環回到'a',所以你應該可以這樣稱呼它將代碼點(或二進制)的列表轉換爲字符串

MyList.caesar('ryvke', 13)

,它應該返回一個字符串。

我有一個映射在列表上,並執行增加了一個功能,但它返回一個charlist,我無法弄清楚如何將其轉換爲字符串:

defmodule MyList do 
    def caesar(list, n) do 
    Enum.map list, &(perform_addition(&1, n)) 
    |> to_charlist 
    |> to_string 
    end 

    defp perform_addition(char_val, n) when char_val < 122 do 
    char_val + n 
    end 

    defp perform_addition(_, n) do 
    97 + n 
    end 
end 

我試着:

基礎上,最後一顆子彈的嘗試導致:

MyList.caesar('ryvke', 13) 
# => <<127, 194, 134, 194, 131, 120, 114>> 

回答

5

要回答標題中的問題:你正在尋找List.to_string/1

iex(1)> List.to_string([97, 98, 99]) 
"abc" 

您沒有爲這些參數獲取可讀字符串的原因是您的旋轉值的邏輯不正確。這裏是你如何可以轉移小寫字母和旋轉回a如果它與z不觸摸非小寫字母:

# ?a == 97, ?z == 122 
defp add(ch, n) when ch in ?a..?z do 
    rem((ch - ?a + n), 26) + ?a 
end 
defp add(ch, _), do: ch 

有了這個,你只需要功能在輸入charlist地圖,然後撥打List.to_string/1

def caesar(list, n) do 
    list |> Enum.map(&add(&1, n)) |> List.to_string 
end 
iex(1)> MyList.caesar('ryvke', 13) 
"elixr" 

(出於某種原因被稱爲凱撒)

該算法被稱爲Caesar Cipher

相關問題