Ruby 凯撒密码没有改变这个词

Ruby Caesar Cipher not changing the word

我正在根据 Rosetta Code 中的代码在 Ruby 中创建一个凯撒密码,但我的代码只打印原始单词,而不是修改后的单词。

这是我的代码:

class String
  ALPHABET = ("A".."Z").to_a

  def caesar_cipher(num)
    self.tr(ALPHABET.join, ALPHABET.rotate(num).join)
  end

end

word = gets.chomp.to_s

encypted  = "#{word}".caesar_cipher(8)
decrypted = "#{word}".caesar_cipher(-8)

puts "Encrypt or Decrypt?"

choice = gets.chomp.to_s.downcase

if choice == "encrypt"
  puts encypted
elsif choice == "decrypt"
  puts decrypted
else
  puts "Invalid option"
end

如有任何帮助,我们将不胜感激!

您的ALPHABET数组只包含大写字母,因此您的相应方法只考虑大写字母。您需要更新 ALPHABET 以包含小写字母,然后您的代码才能按预期工作。

您不一定需要声明常量 ALPHABET,但如果您愿意,也可以。 tr方法复制一个String对象,然后用指定的字符替换String中的字符。如前所述,您只是说要检查大写字母并替换它们,但您正在使用一个词并将其小写:

word = gets.chomp.to_s.downcase

您可以这样修改您的方法:

class String

def caeser_cipher(num)
    self.tr('a-z',("a".."z").to_a.rotate(num).join)
end

现在,您获得了加密字符串(如果需要,您可以随时将其转换为大写):

"hello".caeser_cipher(8)
=> "pmttw"