在ruby中用整数递增字符串

时间:2018-03-31 15:20:09

标签: ruby

假设字符串为grep /usr/include/limits.h -e 'UINT_MAX' --color 且用户输入为3,则输出变为"abc"

每个字符都应该被用户输入增加为整数值。

我写了一个代码,但它给出了一个错误。还有其他办法吗?

"def"

3 个答案:

答案 0 :(得分:5)

您的代码中需要添加几项内容:

  • 而不是String.new,您只需在引号中添加字符串即可。
  • str.split("")可以是str.chars
  • $j = $j + 1可以是$j += 1
  • 如果您在$j$n之间进行比较,则<<应为<
  • 您不需要;,除非您在一行中写完所有内容。
  • begin; end while可以只是while; end

我猜它可能就像:

n = gets.to_i
s = 'abc'
s.split('').each do |i|
  j = 0
  x = i
  while j < n
    x = x.next
    j += 1
  end
  puts x
end

但你可以在字符串中的每个字符串上使用String#ord来返回它的序数,添加用户输入,然后String#chr以获取该数字的ASCII字符:

# With n being the user's input as integer, in this case 3.
p 'abc'.chars.map { |char| (char.ord + n).chr }.join 
# "def"

在@Ganesh的评论中添加了n = gets.to_i

如果要查找Caesar Cipher实现:

def foo(string, n)
  lower = ('a'..'z').to_a.join
  upper = ('A'..'Z').to_a.join
  string.tr(lower + upper, lower[n..-1] + lower[0...n] + upper[n..-1] + upper[0...n])
end

p foo('XYZ', 1) # "YZA"
p foo('ABC', 1) # "BCD"
p foo('ABC', 3) # "DEF"

较慢,但......

答案 1 :(得分:4)

您可以使用trrotate。假设您想要一个圆形映射,即'z' => 'a'表示+1地图。

def caesar str, n
  str.tr 'a-z', [*'a'..'z'].rotate(n).join
end

caesar 'abc', 3 #=> 'def'
caesar 'xyz', 3 #=> 'abc'

有关这些方法的信息,请参阅docs

答案 2 :(得分:2)

如果所有字符都是小写的ASCII字母:

def caesar(str, n)
  base = 'a'.ord
  str.gsub(/./) { |c| (base + (c.ord+n-base) % 26).chr }
end

str = "abcxyza"
caesar(str,  1) #=> "bcdyzab"
caesar(str,  2) #=> "cdezabc"
caesar(str, 25) #=> "zabwxyz"
caesar(str, 26) #=> "abcxyza"

如果所有字符都是ASCII字母:

def caesar(str, n)
  str.gsub(/./) do |c|
    base = (c==c.upcase ? 'A' : 'a').ord
    (base + (c.ord+n-base) % 26).chr
  end
end

str = "AbcDefXyZa"
caesar(str,  1) #=> "BcdEfgYzAb"
caesar(str,  2) #=> "CdeFghZaBc"
caesar(str, 25) #=> "ZabCdeWxYz"
caesar(str, 26) #=> "AbcDefXyZa"