【问题标题】:Caesar Cipher shift on a string using shifting number凯撒密码使用移位数字在字符串上移位
【发布时间】:2014-12-08 00:40:14
【问题描述】:

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

【问题讨论】:

  • c = alphabet[n] 不会更新字符,它只是分配给从未使用过的局部变量 c
  • 您没有更新str,所以不能指望它会包含结果。 Enumerator#each* 系列方法返回包含对象,没有块结果。您可以寻找Enumerable#collect (#map) 方法。此外,将n 保持在 0-25 边界的条件可以简单地用模重写,例如 n %= 26
  • 你是对的。我使用了地图,它工作了谢谢。
  • 实际上,我做了一些小的改动。注意到一些奇怪的地方:小写字母不受影响,空格分割不是必需的(空格不在字母表中,但在这种情况下应该修改块以返回c),使用each_char(可以像@ 987654332@收集结果)。我应该更深入地报告我的发现,还是你自己想办法?

标签: ruby arrays string


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

【讨论】:

    【解决方案2】:
      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
    

    【讨论】:

    • 这与我上面提到的同样的问题:它不影响大写字母。
    • 我知道,它没有。我专注于主要问题。抱歉没有详细说明。现在更新了。
    • @TesfaZelalem 您可以使用String#tr 替换字符,例如:"caesar cipher".tr(alphabet.join, alphabet.rotate(2).join)
    猜你喜欢
    • 2014-09-28
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 2013-10-07
    • 2014-12-23
    相关资源
    最近更新 更多