Caeser Cipher Ruby

时间:2016-01-20 19:38:18

标签: ruby hash

好的,所以我正在学习ruby并创建了一个caeser密码。当我看到其他人的解决方案后,他们不同,然后我想出了什么。我在解决他们的解决方案的工作方式时遇到了一些麻烦。它绝对看起来像我创造的更有效/更优雅的解决方案。

def caesar_cipher(string, shift = 1)
  alphabet  = Array('a'..'z')
  non_caps  = Hash[alphabet.zip(alphabet.rotate(shift))]

  # I understand this is making an a-z array, then making a hash  with  the key being the original and value being the shifted letter ie. with a shift of 3, "a" => "d" 

  alphabet = Array('A'..'Z')         
  caps     = Hash[alphabet.zip(alphabet.rotate(shift))]

  encrypter = non_caps.merge(caps)  #I think that this just combines the two hashes together?  

  string.chars.map { |c| encrypter.fetch(c, c) }
        #This is the part i really just do not fully understand. You split the string up into characters, then iterate through each one, then does fetch just replace the letter with the the correlated values in the hash?

end

p caesar_cipher("testingzZ1Z").join

我只是想确保我正确地理解这一点,并且很想知道是否有更好的方法来创建这样的密码。

1 个答案:

答案 0 :(得分:1)

您应该尝试更频繁地查看Ruby文档。

是的,Hash#merge将两个哈希组合在一起。

Hash#fetch将尝试获取哈希值中的值,如果无法找到,则可以提供默认值。

所以encrypter会替换它可以加密的所有字符。如果它不能加密它,因为它不在哈希中,那就不管它了。