凯撒密码索引

Caesar cypher indexing

谁能简单地解释一下这一行发生了什么:

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)

它是将字母表中由 (alphabet.index(i.downcase) - num 表示的字母添加到新单词中。

i.downcase 只是将字母转换为小写(如果尚未转换)。

alphabet.index 查找字母表中 i 所在的位置。

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

所以它获取字母,将其转换为小写,然后是数组索引,用 num 修改该索引并将新索引代表的字母添加回单词。

new_word 是一个 String,所以右边的值将附加到它上面。表达式 alphabet[alphabet.index(i.downcase) - num] 只是一种确定在字母表中移动 num 位的字符的低效方法。

alphabet 是一个 Array 包含对应于字母表字母的字符值,以小写字母开头,然后是大写字母。

本例中的index方法查找字符值ialphabet中第一次出现的索引。然后该指数减少 num。这个新位置对应的字符最后在alphabet中查找,结果追加到new_word.

另请注意,如果新索引为负,则结果将“回绕”,数组将从后面索引,如果 num 不是太大,则结果为大写字母.这些潜在的大写字母将在 new_word.downcase.capitalize.

中小写

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