Caesar Cipher使用移位数字移动字符串

时间:2014-10-13 12:35:48

标签: ruby arrays string

我有这个问题。 使用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"

2 个答案:

答案 0 :(得分:1)

  str = str.split("")
  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"]
  alphabet2 = ["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"]
  while num > 25 
    num -= 26
    end

  str = str.map do |char|
    if alphabet.include?(char)
      n = alphabet.index(char) + num
      while n > 25
        n -= 26
        end
      char = alphabet[n]

     elsif alphabet2.include?(char)
       m = alphabet2.index(char) + num



      while m > 25
        m -= 26
        end
      char = alphabet2[m]
      else
       char

     end
    char
    end

  return str.join


end

答案 1 :(得分:1)

def cipher_shift(s, n)
  letters = [*'a'..'z'] 
  s.chars.map {|x| letters.include?(x.downcase) ? (x.ord + n).chr : x}.join
end