【发布时间】:2014-12-08 00:40:14
【问题描述】:
我有这个问题。 使用 Ruby 语言,让函数 CaesarCipher(str,num) 获取 str 参数并使用 num 参数作为移位数对其执行 Caesar Cipher 移位。凯撒密码的工作原理是将字符串 N 中的每个字母在字母表中向下移动(在这种情况下,N 将是 num)。标点、空格和大小写应保持不变。例如,如果字符串为“Caesar Cipher”且 num 为 2,则输出应为“Ecguct Ekrjgt”。
我的任何代码都是这样的。我认为我遇到的唯一问题是更新每个字母,然后更新循环中的每个单词。请帮忙。谢谢
def Caesar_cipher(str, num)
if num > 25
num -= 26
end
alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
str = str.split(" ")
str.each do |word|
word.each_char do |c|
if alphabet.include?(c)
n = alphabet.index(c) + num
if n > 25
n -= 26
end
c = alphabet[n]
end
end
end
return str
end
puts Caesar_cipher("zabcd", 1) // "zabcd"
【问题讨论】:
-
c = alphabet[n]不会更新字符,它只是分配给从未使用过的局部变量c。 -
您没有更新
str,所以不能指望它会包含结果。Enumerator#each*系列方法返回包含对象,没有块结果。您可以寻找Enumerable#collect(#map) 方法。此外,将n保持在 0-25 边界的条件可以简单地用模重写,例如n %= 26。 -
你是对的。我使用了地图,它工作了谢谢。
-
实际上,我做了一些小的改动。注意到一些奇怪的地方:小写字母不受影响,空格分割不是必需的(空格不在字母表中,但在这种情况下应该修改块以返回
c),使用each_char(可以像@ 987654332@收集结果)。我应该更深入地报告我的发现,还是你自己想办法?