ruby 带有隐藏bug的编码挑战解决方案

5tmbdcev  于 2023-06-22  发布在  Ruby
关注(0)|答案(2)|浏览(156)

最近我在图灵机上接受了一个编程挑战。问题是:
你将得到一个字符串列表(ops)作为输入。

  • 如果它是一个整数,你必须保持一个记录
  • 如果它是一个字符'C',你必须删除最后记录的元素
  • 如果它是一个字符'D',你必须将最后一个元素加倍并记录它
  • 如果它是一个字符'+',你必须添加最后两个元素,并记录它返回记录的最终总和。

输入示例,ops = ["5", "2", "C", "D", "+"]output = 30
我能够编写代码,但它没有通过。回顾过去,我只是想找出哪里出了问题。请在下面找到我的代码:

def score_calculator
    scores = []
    ops.each do |rec|
        scores << rec.to_i if rec.is_a?(Integer)
        scores << scores.last(2).sum if rec == '+'
        scores << (scores.last.to_i * 2) if rec = 'D'
        scores.pop if rec == 'C'
    end
    return scores.sum
end
bfhwhh0e

bfhwhh0e1#

在Ruby中,这通常是用一个case来完成的,而不是尾随的if。这意味着如果正确地进行,则不可能发生无意的分配。case recwhen 'D'将始终是安全的。
例如:

scores <<
  case rec
  when /\A\d+\z/
    rec.to_i
  when '+'
    scores.last(2).sum
  when 'D'
    (scores.last.to_i * 2)
  when 'C'
    scores.pop
  else
    # ...?
  end
c7rzv4ha

c7rzv4ha2#

下面是如何运行您的代码,只需一点改进。

def score_calculator
    scores = []
    ops.each do |rec|
        scores << rec.to_i if rec.match?(/[[:digit:]]/)
        scores << scores.last(2).sum if rec == '+'
        scores << (scores.last.to_i * 2) if rec == 'D'
        scores.pop if rec == 'C'
    end
    return scores.sum
end

相关问题