【问题标题】:CoderByte CaesarCipher Excercise in RubyRuby 中的 CoderByte CaesarCipher 练习
【发布时间】:2015-01-29 20:39:55
【问题描述】:

这是问题:使用 Ruby 语言,让函数 CaesarCipher(str,num) 获取 str 参数并使用 num 参数作为移位数对其执行 Caesar Cipher 移位。凯撒密码的工作原理是将字符串 N 中的每个字母在字母表中向下移动(在这种情况下,N 将是 num)。标点、空格和大小写应保持不变。例如,如果字符串为“Caesar Cipher”且 num 为 2,则输出应为“Ecguct Ekrjgt”

这是我的代码

def CaesarCipher(str,num)
alphabet = ("a".."z").to_a.join("")
alphabetupcase = ("a".."z").to_a.join("").upcase
i=0
result = ""


  while i < str.length
    if alphabet.include?(str[i])
      result += alphabet[alphabet.index(str[i]) + num]
    elsif alphabetupcase.include?(str[i])
      result += alphabetupcase[alphabetupcase.index(str[i]) + num]
    else
     result += str[i]
    end
    i += 1
  end


  # code goes here
  return result 

end

我不断收到此错误 (eval):11: (eval):11:in +': can't convert Fixnum into String (TypeError) from (eval):11:inCaesarCipher' from (eval):26

这有什么问题,如何修复此代码? 记住我是 Ruby 的初学者,你能提出一个更好的解决方案吗? 先谢谢大家了

【问题讨论】:

  • 你在测试什么字符串? n = CaesarCipher("hello", 1) 对我来说效果很好。你使用的是什么版本的 ruby​​?
  • 老实说,我没有使用任何版本,只是在 CoderByte 的编码空间中为这个挑战做它coderbyte.com/CodingArea/information.php?ct=Caesar%20Cipher 我还在 Repl.it 上对其进行了测试,它工作了几次然后开始给出同样的错误.我不知道为什么。就像你说的,这可能是因为 Ruby 版本。

标签: ruby debugging


【解决方案1】:

您的代码不起作用,因为您错过了模运算 - 如果您将字母“z”移动 2,您应该得到“b”。在这种情况下,您的程序会失败。计算新字母索引的算法是:(index + shift) modulo alphabet_size

但我会这样做:

def caesar (str, num)
  str.split('').collect do |character|
    case character
    when 'a'..'z', 'A'..'Z'
      base_ascii = if character == character.upcase then 'A'.ord else 'a'.ord end
      (((character.ord - base_ascii + num) % ('a'..'z').count) + base_ascii).chr
    else
      character
    end
  end.join('')
end

首先,迭代字符串的每个字符。如果是字母,计算移位(注意base_ascii,它是'A'或'a'的ASCII码,取决于移位是小写还是大写),这只是一个字母索引(@ 987654324@ - base_ascii) 加上移位 (num) 以字母表中的字母数为模数 (('a'..'z').count)。如果字符不是字母,则空格、标点将原样返回。

【讨论】:

  • 感谢您的回答 Grych :) 由于声誉限制,我无法投票。我也会尝试学习ASCII码解决方案。
  • 在@Grych 所说的基础上,尝试遵循蛇形方法名称的 ruby​​ 标准。 CamelCase 看起来像一个类名,因此会引起混淆。
  • @MehmetRagıpAltuncu,请阅读我的更新答案。你的代码不能正常工作,它只适用于你给出的例子,但这只是一个幸运的打击。
  • @Grych 好的,如果可以的话,我会尝试了解如何使用模运算)再次感谢您
  • @snowe2010 是的 CamelCase 是 CoderByte 的格式。按照您的建议,我将蛇盒用于 Ruby。谢谢
【解决方案2】:

我建议在这里查看其他一些 Caesar 密码实现:https://codereview.stackexchange.com/questions/55049/learning-ruby-caesar-cipher

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多