【问题标题】:Incrementing string by integer in ruby在ruby中按整数递增字符串
【发布时间】:2018-04-01 12:54:30
【问题描述】:

假设字符串为"abc",用户输入为3,则输出为"def"

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

我写了一个代码,但它给出了一个错误。有没有其他方法可以做到这一点?

#!/usr/bin/ruby -w

puts "Enter the value of n";
$n=gets;
s = String.new("abc");
s.split("").each do |i|
    $j = 0;
    x = i;
    begin
         x.next;
         $j = $j + 1;
    end while $j < $n

    puts x;
end

【问题讨论】:

  • 应该&lt;&lt;&lt;
  • 是的 @SebastianPalma 我刚刚编辑过。
  • @SebastianPalma 我也尝试过 (i.ord + n).chr 直接将 a 转换为 d 避免 x.next 但这也给出了错误 - 在 `+': String can't be coerced进入 Fixnum (TypeError)
  • 见 ganesh 的回答。尝试将用户的输入解析为整数$n=gets.to_i。请参阅repl
  • 您是否考虑过 +n 字符不在字母表中的字符串的所需输出,例如'xyz' 等?

标签: ruby


【解决方案1】:

您的代码中有几件事要添加:

  • 代替String.new,您只需将字符串添加到引号内即可。
  • str.split("") 可以是str.chars
  • $j = $j + 1 可以是$j += 1
  • 如果您在$j$n 之间进行比较,那么&lt;&lt; 应该是&lt;
  • 您不需要;,除非您将所有内容写在一行中。
  • 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"

添加n = gets.to_i @Ganesh 在 cmets 中所述。

如果寻找凯撒密码实现:

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"

慢一点,但是...

【讨论】:

  • 感谢您的回答。实际上有一个错误令人不安:在 `
  • 这很奇怪,因为jn 总是数字,你尝试的代码是什么?
  • 我这次使用了你建议的相同代码:但没有比较 j 和 n。在 `
  • 查看工作代码here,您的实现方式是否相同?
  • 如果你有'xyz'并且n = 1,这会返回什么?
【解决方案2】:

您可以使用trrotate。假设您需要循环映射,即 'z' =&gt; '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

【讨论】:

【解决方案3】:

如果所有字符都是小写的 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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 2020-01-09
    相关资源
    最近更新 更多