【问题标题】:Ruby on Rails - Calculate Size of Number RangeRuby on Rails - 计算数字范围的大小
【发布时间】:2014-03-04 10:48:15
【问题描述】:

请原谅我缺少代码,但我无法确定实现以下目标的最佳方法:

两个字符串(由于前导 0 存储为字符串 - 它们是电话号码):

a = '0123456700'
b = '0123456750'

我正在尝试找到一种方法将它们写成一个范围,如下所示

0123456700 - 750

而不是

0123456700 - 0123456750

我目前拥有的。

这并不像获取b 的最后 3 位数字那么简单,因为范围可能会有所不同,并且可能会上升到 4 位数字,所以我正在努力寻找能够做到这一点的最佳方法。

【问题讨论】:

  • 为什么不是0123456700 - 50?是什么决定要省略多少位数字?
  • 这是一个很好的观点,我只是在想自己是否应该是 - 750- 50。无论范围如何,我都会对任何有效的解决方案感到满意。

标签: ruby-on-rails ruby ruby-on-rails-2


【解决方案1】:

我会查找第一对不相等字符的索引:

a = '0123456700'
b = '0123456750'

index = a.chars.zip(b.chars).index { |x, y| x != y }
#=> 8

并提取后缀:

"#{a} - #{b[index..-1]}" if index
#=> "0123456700 - 50"

【讨论】:

  • 比我的版本好多了!
  • 不错的答案,对我来说似乎是 Rails 的魔法。这本来是完美的,但我想我现在更喜欢返回750 而不是像@TomFenech 的回答中那样只返回50,但这只是我没有锁定我的要求的错,但我相信其他人会找到所有这个问题的答案非常有用。
  • @martincarlin87 您可以简单地调整范围,例如"#{a} - #{b[index-1..-1]}"
  • 很好,谢谢。当您发布答案时,我已经测试并接受了 Tom Fenech 的答案,如果不接受然后接受您的答案,我会感到难过 - 反正您不需要积分 :)
【解决方案2】:

这是一个返回范围的方法:

def my_range(a, b)
  a = a.delete(" ") # remove all spaces from string                                                                                            
  b = b.delete(" ")
  a, b = b, a if a.to_i > b.to_i # a is always smaller than b                                                                                  
  ai, bi = a.to_i, b.to_i
  pow = 1
  while ai > 1
    pow += 1
    len = pow if ai % 10 != bi % 10
    ai /= 10
    bi /= 10
  end
  a + " - " + b[-len..-1]
end

puts my_range("0123456700", "0123456750")   # 0123456700 - 750
puts my_range("0123456669", "0123456675")   # 0123456669 - 675
puts my_range("0123400200", "0123500200")   # 0123400200 - 3500200
puts my_range("012 345 678", "01 235 0521") # 012345678 - 350521

【讨论】:

  • 这是不一致的。对于 OP 的示例,右侧两位数不同,它分别显示三位,但对于 a = "0123456669"b = "0123456675",两位数不同,它显示两位。
  • @sawa 好点,我添加了一个一致的新版本
  • 感谢修订版,我错过的一个疏忽是人们正在用空格格式化数字 - 第一个不管任何空格都有效,但由于某种原因,修订后的答案似乎引发了“格式化”的错误'数字。附言假设b > a 是安全的,因为a 始终是范围的开始,b 始终是范围的结束。
  • 啊,通过将.delete(' ' ) 添加到ab 的初始化中并在方法结束时返回未修改的a(原始格式化数字)而不是a 没有空格。
  • 我打算使用gsub,但这是一个更好的主意。我已经编辑了答案以显示最终版本。
【解决方案3】:

来自我的个人图书馆(简体):

def common_prefix first, second
  i = 0
  loop{break unless first[i] and second[i] == first[i]; i += 1}
  first[0, i]
end

a = "0123456700"
b = "0123456750"
c = "0123457750"

common_prefix(a, b)
# => "01234567"

"#{a} - #{b.sub(common_prefix(a, b), "")}"
# => "0123456700 - 50"

"#{a} - #{c.sub(common_prefix(a, c), "")}"
# => "0123456700 - 7750"

注意。这只有在所有字符串都用0 正确填充以保持相同长度的假设下才能正常工作。

【讨论】:

  • 感谢您分享您个人图书馆中的一些内容,我现在就试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多