"买车" Ruby代码战

时间:2017-06-15 00:32:13

标签: ruby

我正在尝试对Ruby代码战进行挑战,因为我通过了样本测试,但我无法通过最后一次测试。我得到错误预期:[8,597],而得到:[8,563]。

  

说明:

     

一个男人有一辆相当旧车,价值2000美元。他看到了一辆二手车   价值8000美元。他想保留他的旧车,直到他能买到   二手的。

     

他认为他每个月可以节省1000美元,但他的旧车的价格   而新的每月减少1.5%。而且   损失百分比在每个结束时增加0.5%   两个月。

     

每月损失百分比的示例:

     

例如,如果在第一个月末,损失百分比为1,   第二个月末损失百分比为1.5,第三个月末仍为   1.5,第4个月结束2等等......

     你能帮助他吗?我们的人发现很难做到这一切   计算

     

他需要多少个月才能积蓄足够的钱购买   他想要的车,还剩下多少钱?

def nbMonths(startPriceOld, startPriceNew, savingperMonth, percentLossByMonth)
  months = 0
  leftover = 0
  currentSavings = 0
  until (currentSavings + startPriceOld) >= (startPriceNew)
    months += 1
    months.even? ? percentLossByMonth = percentLossByMonth + 0.5 : percentLossByMonth
    startPriceNew = startPriceNew * (1 - (percentLossByMonth/100))
    startPriceOld = startPriceOld * (1 - (percentLossByMonth/100))
    currentSavings = currentSavings + savingperMonth
  end
  leftover = currentSavings + startPriceOld - startPriceNew
  return [months, leftover.abs.to_i]
end

我不想看解决方案,我不需要一个解决方案只是在正确的方向上推动会非常有帮助。

另外,我认为代码可能在很多方面都是次优的,但是我已经开始编码2周了,所以尽我所能。

Tnx球员

2 个答案:

答案 0 :(得分:3)

你的算法很好。但是你有两个编码错误:

1)percentLossByMonth需要在将它除以100之前转换为浮点数(5/100 = 0而(5.to_f)/ 100 = 0.05)

2)在说明中说你需要返回剩下的最接近的整数,即leftover.round

def nbMonths(startPriceOld, startPriceNew, savingperMonth, percentLossByMonth)
  months = 0
  leftover = 0
  currentSavings = 0
  until (currentSavings + startPriceOld) >= (startPriceNew)
    months += 1
    percentLossByMonth += months.even? ? 0.5 : 0    
    startPriceNew = startPriceNew * (1 - (percentLossByMonth.to_f/100))
    startPriceOld = startPriceOld * (1 - (percentLossByMonth.to_f/100))
    currentSavings += savingperMonth
  end
  leftover = currentSavings + startPriceOld - startPriceNew
  return [months, leftover.round]
end

答案 1 :(得分:2)

您的代码问题已经确定,因此我将提供另一种计算方法。

r = 0.015
net_cost = 8000-2000
n = 1
months, left_over = loop do
  r += 0.005 if n.even?
  net_cost *= (1-r)
  tot = n*1000 - net_cost
  puts "n=#{n}, r=#{r}, net_cost=#{net_cost.to_i}, " +
    "savings=#{(n*1000).to_i}, deficit=#{-tot.to_i}"
  break [n, tot] if tot >= 0
  n += 1
end
  #=> [6, 766.15...]
months
  #=> 6
left_over
  #=> 766.15...

并打印

n=1, r=0.015, net_cost=5910, savings=1000, deficit=4910
n=2, r=0.020, net_cost=5791, savings=2000, deficit=3791
n=3, r=0.020, net_cost=5675, savings=3000, deficit=2675
n=4, r=0.025, net_cost=5534, savings=4000, deficit=1534
n=5, r=0.025, net_cost=5395, savings=5000, deficit=395
n=6, r=0.030, net_cost=5233, savings=6000, deficit=-766