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"
我正在根据 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"