好的,所以我正在学习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
我只是想确保我正确地理解这一点,并且很想知道是否有更好的方法来创建这样的密码。
答案 0 :(得分:1)
您应该尝试更频繁地查看Ruby文档。
是的,Hash#merge
将两个哈希组合在一起。
Hash#fetch
将尝试获取哈希值中的值,如果无法找到,则可以提供默认值。
所以encrypter
会替换它可以加密的所有字符。如果它不能加密它,因为它不在哈希中,那就不管它了。