【问题标题】:Convert character 'A' to 'B' if I add 1 [closed]如果我添加 1,则将字符“A”转换为“B”[关闭]
【发布时间】:2017-11-07 13:23:01
【问题描述】:

假设你有一个字符/字符串,“A”。

如果将'A'加1,你会写什么来将它转换为'B'。如果我添加 '2' 它应该被转换为 'C' 等等......

【问题讨论】:

  • 请提供有关问题的更多详细信息。
  • -5? :) 有那么糟糕吗?
  • 我猜没有提供足够的信息。如果您提供更多详细信息会更好。例如:你会只使用大写字母吗?你会添加到Z 吗?如果是这样,你期望什么行为?
  • 除了规则之外,不清楚 "add 1 to 'A'" 是什么意思。你想写一个函数convert('A', 1)返回'B'还是你想改变内置的'A' + 1让它返回'B'

标签: ruby


【解决方案1】:

也许是这样的?:

array = ('a'..'z').to_a
p array[array.index('a'.downcase) + 1].upcase

【讨论】:

  • 或者如果您知道('A'..'Z') 总是大写字母,则无需大写或大写。
  • 您可以受益于rotate(即array[array.rotate(-1).index('a')])并避免'z' + 1问题。
  • 这很好更快@Gerry!
  • @Gerry array.rotate(1).first 也可以;)
  • @Gerry 也许是array.rotate(array.index('b') + 1).first。比你的略长,但偏移量是正数,并且代码中有类似 'b' + 1 的内容。
【解决方案2】:

您可以通过.ord往返

'a'.ord # => 97
'a'.ord + 2 # => 99
('a'.ord + 2).chr # => "c"
('A'.ord + 5).chr # => "F"

【讨论】:

  • 对于'z''Z' 等可能会很麻烦。
  • @sagarpandya82:未指定边缘条件行为 :)
  • 好的,你找到我了。 OP:如果您有兴趣并希望将“Z”转换为“A”等,您可以扩展 String 并定义如下内容:((((self.ord - 65) + n) % 26) + 65).chr。小写字母也是如此。
【解决方案3】:

进一步Sergio's answer,您可以隔离字母序数并使用模数。

class String
  def plus n
    case self
    when ('a'..'z')
      (((ord - 97 + n) % 26) + 97).chr            #ord means self.ord
    when ('A'..'Z')
      (((ord - 65 + n) % 26) + 65).chr
    else
      raise "single-letters only"
    end
  end
end

'a'.plus 2 #=> 'c'
'z'.plus 1 #=> 'a'
'A'.plus 0 #=> 'A'
'Z'.plus 9 #=> 'I'
'/'.plus 1 #=> test.rb:9:in `plus': single-letters only (RuntimeError)

您的问题不清楚,但正如 Stefan 在 cmets 中提到的那样,您可能需要 'A' + 1 #=> 'B' 表示法。 Ruby 确实允许覆盖String#+。但不要这样做,这只是为了表明你可以:

class String
  def +(n)
   #code as above...
  end
end

然后通过语法糖,你可以这样做:

'a' + 2 #=> 'c'
'z' + 1 #=> 'a'
'A' + 0 #=> 'A'
'Z' + 9 #=> 'I'
'/' + 1 #=> test.rb:9:in `plus': single-letters only (RuntimeError)

【讨论】:

  • 哦,你可以使用case selfwhen 'a'..'z' / when 'A'..'Z'
  • @Stefan 我赞成你的case self 想法。它看起来比我拥有的要干净得多。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
  • 2012-09-03
  • 2015-05-01
  • 1970-01-01
相关资源
最近更新 更多