2015-04-06 77 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