在Ruby中创建一个Caesar Cipher,收到错误

时间:2016-01-25 22:13:03

标签: ruby caesar-cipher

我正在尝试使用Ruby为我的计算机科学课创建一个Caesar Cipher。我的朋友能够创建部分代码:

def cipher(word, n)
new_word = ""
word.each_char do |i|
    n.times do
        if(i == "z")
            i = "a"
            next
        elsif(i == "Z")
            i = "A"
            next
        end
        i.next!
        i == "%" ? i = " " : ""
    end
    new_word += i   
end
puts new_word
end
cipher("phrase", 5)

最后一行是您要放置要加扰的词组的位置,数字是您想要加扰的数量。其中一个要求是我们使用gets.chomp指定一个短语和数量加扰,而不编辑.rb文件本身。所以我想出了这个:

puts "What would you like to scramble?"
word = gets.chomp
puts "How much would you like to scramble that?"
n = gets.chomp
def cipher(word, n)
new_word = ""
word.each_char do |i|
    n.times do
        if(i == "z")
            i = "a"
            next
        elsif(i == "Z")
            i = "A"
            next
        end
        i.next!
        i == "%" ? i = " " : ""
    end
    new_word += i   
end
puts new_word
end
cipher(word, n)

我在终端中运行时输出以下错误:

some.rb:10:in `block in cipher': undefined method `times' for "5":String (NoMethodError)
from some.rb:9:in `each_char'
from some.rb:9:in `cipher'
from some.rb:26:in `<main>'

如果有人可以帮助我弄清楚我做错了什么,这对我帮助很大。

4 个答案:

答案 0 :(得分:1)

.to_i上致电n

您需要将从用户输入中获得的字符串转换为数字,然后才能在其上运行.times.to_i为您做到这一点。

实施例: http://progzoo.net/wiki/Ruby:Convert_a_String_to_a_Number

答案 1 :(得分:1)

前一段时间,这些要求只是小写的ASCII字母,希望你能按照自己的方式做到这一点:

def encrypt(msg, key)
    msg.downcase.split("").each_with_index do |char, i|
        next if msg[i] == " "
        msg[i] = (msg[i].ord + key) > 122 ? (((msg[i].ord + key) % 123) + 97).chr : (msg[i].ord + key).chr
    end
    msg
end

def decrypt(msg, key)
    msg.downcase.split("").each_with_index do |char, i|
        next if msg[i] == " "
        msg[i] = (msg[i].ord - key) < 97  ? (123 - (97 - (msg[i].ord - key))).chr : (msg[i].ord - key).chr
    end
    msg
end

答案 2 :(得分:1)

gets.chomp返回一个字符串

word = gets.chomp

所以word是一个字符串,正如预期的那样,但是你再次调用gets.chomp,这次是为了获得应该应用于字符串的scrabbles数量。所以n也是一个字符串。

n = gets.chomp

当你在times上调用n方法时,它没有被定义,因为它只对整数有意义。解决方案是将n转换为整数。这应该有效:

n = gets.chomp.to_i

<强>更新

有关String实例的to_i方法的文档:http://ruby-doc.org/core-2.0.0/String.html#method-i-to_i

答案 3 :(得分:1)

gets.chomp返回一个字符串,您必须将其转换为数字才能调用.times方法。按n = gets.chomp

更改此行n = gets.chomp.to_i