我的代码出了什么问题?

时间:2017-03-08 22:26:00

标签: ruby

    def encrypt(string)
      alphabet = ("a".."b").to_a
      result = ""
      idx = 0
      while idx < string.length
        character = string[idx]

        if character == " "
          result += " "
        else
          n = alphabet.index(character)
          n_plus = (n + 1) % alphabet.length
          result += alphabet[n_plus]
        end
        idx += 1
      end
      return result
    end
    puts encrypt("abc")
    puts encrypt("xyz")

我正试图让“abc”打印出“bcd”和“xyz”来打印“yza”。我希望将这封信向前推进1.有人能指出我正确的方向吗?

4 个答案:

答案 0 :(得分:4)

我所要做的就是将你的字母数组更改为a到z,而不是a到b,并且它可以正常工作。

def encrypt(string)
  alphabet = ("a".."z").to_a
  result = ""
  idx = 0
  while idx < string.length
    character = string[idx]

    if character == " "
      result += " "
    else
      n = alphabet.index(character)
      n_plus = (n + 1) % alphabet.length
      result += alphabet[n_plus]
    end
    idx += 1
  end
  return result
end
puts encrypt("abc")
puts encrypt("xyz")

答案 1 :(得分:2)

另一种解决问题的方法,我认为更简单,就是使用String#tr

ALPHA = ('a'..'z').to_a.join             #=> "abcdefghijklmnopqrstuvwxyz"
BMQIB = ('a'..'z').to_a.rotate(1).join   #=> "bcdefghijklmnopqrstuvwxyza"

def encrypt(str)
  str.tr(ALPHA,BMQIB)
end

def decrypt(str)
  str.tr(BMQIB,ALPHA)
end

encrypt('pizza') #=> "qjaab"
decrypt('qjaab') #=> "pizza"

答案 2 :(得分:0)

你的问题已得到解答,所以这里有几种类似Ruby的方法。

String#gsub与哈希

一起使用
CODE_MAP = ('a'..'z').each_with_object({}) { |c,h| h[c] = c < 'z' ? c.next : 'a' }
  #=> {"a"=>"b", "b"=>"c",..., "y"=>"z", "z"=>"a"}
DECODE_MAP = CODE_MAP.invert
  #=> {"b"=>"a", "c"=>"b",..., "z"=>"y", "a"=>"z"}

def encrypt(word)
  word.gsub(/./, CODE_MAP)
end

def decrypt(word)
  word.gsub(/./, DECODE_MAP)
end

encrypt('pizza')
  #=> "qjaab"

decrypt('qjaab')
  #=> "pizza"

String#gsubArray#rotate

一起使用
LETTERS = ('a'..'z').to_a
  #=> ["a", "b", ..., "z"]

def encrypt(word)
  word.gsub(/./) { |c| LETTERS.rotate[LETTERS.index(c)] }
 end

def decrypt(word)
  word.gsub(/./) { |c| LETTERS.rotate(-1)[LETTERS.index(c)] }
end

encrypt('pizza')
  #=> "qjaab"

decrypt('qjaab')
  #=> "pizza"

答案 3 :(得分:0)

或者如果您不想占用存储字母表的内存,您可以使用字符编码,然后只使用算术运算来移动字母:

def encrypt(string)      
  result = ""
  idx = 0
  while idx < string.length
    result += (string[idx].ord == 32 ? (string[idx].chr) : (string[idx].ord+1).chr)
    idx += 1
  end

  result
end

关于ruby的另一个奇怪的事情是你不需要在方法体的末尾显式返回一些东西。它只是默认返回最后一件事。这被认为是红宝石人中的好风格。