2015-09-19 83 views
1

有人能简单介绍一下我在这条线会发生什么:凯撒暗号索引

new_word += alphabet[alphabet.index(i.downcase) - num] 

new_word =当前new_word变量+什么状态呢?

这是整个方案:

def cipher(word, num) 
alphabet = ('a'..'z').to_a.concat(('A'..'Z').to_a) 
new_word = "" 

word.each_char do |i| 
    if !alphabet.include?(i) 
    new_word +=i 
    else 
    new_word += alphabet[alphabet.index(i.downcase) - num] 
    end 
end 

return new_word.downcase.capitalize 
end 

puts cipher("Apples? and Oranges!", 2) 
+0

这里有基本上为此构建的String#tr方法。无需转换为unicode或其他。我使用#tr构建了一个密码。让我知道你是否想看看我做了什么。你会发现它更高效和可靠。 – Charles

回答

1

new_wordString,所以右侧的值将被附加到它。表达式alphabet[alphabet.index(i.downcase) - num]只是确定在字母表中移位num的字符的低效方式。

alphabet是一个Array,其中包含与字母表相对应的字符值,以小写字母开头,后面跟着大写字母。

这种情况下的index方法找到alphabet中第一次出现字符值i的索引。该指数然后下降num。对应于这个新位置的字符最终在alphabet中查找,结果附加到new_word

还要注意的是,如果新索引是负数,结果将“环绕”,数组将从后面索引,如果num不是太大,将导致大写字母。这些潜在的大写字母将在new_word.downcase.capitalize中下调。


downcase部分是奇怪的,因为它意味着“密码”不可逆的。还要注意,如果num的绝对值太大以至于查找超出范围,那么这将不会如您所期望的那样工作。

0

它增加了新词的字母在其中所代表的字母(alphabet.index(i.dow​​ncase) - NUM)。

i.dow​​ncase只是将字母转换为小写,如果它还没有。

alphabet.index找到我所在的字母表中的位置。

num减法是密码。它通过修改找到字母的字母索引来更改要添加的字母。数字1会将'b'变成'a',因为'a'在给定的字母表中'b'之前。

因此,它需要将字母转换为小写,然后是数组索引,通过num修改索引,并将新索引代表的字母添加回单词中。