假设字符串为grep /usr/include/limits.h -e 'UINT_MAX' --color
且用户输入为3,则输出变为"abc"
。
每个字符都应该被用户输入增加为整数值。
我写了一个代码,但它给出了一个错误。还有其他办法吗?
"def"
答案 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)
您可以使用tr
和rotate
。假设您想要一个圆形映射,即'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"