2015-04-06 88 views
0

我正在構建一個簡單的加密器來加密紅寶石中的字符串。如何將數組與紅寶石中的鍵進行比較?

cipher = {"a" => "6", "b" => "$", "c" => "X"...} 
key_word = "secret" 
key_word.split(//) 
=> ["s", "e", "c", "r", "e", "t"] 

如何將key_word字符與我的密碼哈希中的密鑰進行比較並返回它們?

+0

請修改您的問題以更正代碼:'key_word.split(//)#=> [「s」,「e」,「c」,「r」,「e」,「t」]'。是的,我們知道你的意思,但你需要做的正確。你可以通過擴展'cipher'來包含所有字母在「祕密」中的密鑰(以及其他幾個字母和點數)來改進你的問題,這樣讀者就可以更容易地測試他們的代碼了。 – 2015-04-06 04:54:22

回答

1

你可以做這樣的事情:

cipher = {"a" => "6", "b" => "$", "c" => "X"} 

'abc'.tr(cipher.keys.join, cipher.values.join) 
#=> "6$X" 

或分割和結合​​(什麼可能是慢得多):

'abc'.each_char.map { |char| cipher[char] }.join 
#=> "6$X" 
0

像這樣簡單:

ciper.values_at(*key_word.split(//)).join 
2

你可以用Rexexp.union和散列參數版本String#gsub

0的
encrypted = key_word.gsub(Regexp.union(cipher.keys), cipher) 
+0

μ,我同意你將字符串轉換爲數組沒有意義。沒有拉姆達? – 2015-04-06 04:48:12

+0

@CarySwoveland在這裏不需要lambda表達式,我使用一個哈希表(它實際上只是一個函數,其域是它的鍵集......)來表示這次的函數:) – 2015-04-06 05:15:23

2

一種形式從一個哈希作爲參數:

encrypted = key_word.gsub(/./, cipher) 

因此,只要符合每個字符,並憑藉其在cipher值替換它。如果cipher沒有等於該字符的鍵,則該字符保持不變。

+0

結果是「X」 。如果密碼沒有與該字符相同的密鑰,則該字符被替換爲空白。 – bluexuemei 2015-04-16 02:07:56

+0

我不遵循'「X:'的意思,我假定'密碼'對每個字符都有一個密鑰,它在我看來,它是任何值得使用它的鹽的要求,解碼的信息,「我已經設置了定時器在_o'時刻停止使用」,並不是很有用。 – 2015-04-16 02:24:27