2017-06-15 87 views
3

我想做Ruby codewars挑战,我卡住了,因为我通过样品测试,但不能通过最后一个。我得到错误预期:[8,597],而是得到:[8,563]。“买车”红宝石codewars

说明:

一个人有一个比较旧的车是价值$ 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 guys

+0

只知道,这个卡塔的网址是什么? –

+0

https://www.codewars.com/kata/554a44516729e4d80b000012/train/ruby – SrdjaNo1

回答

2

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

1)percentLossByMonth需要被转换/ 100 = 0.05)将其除以100(5/100 = 0,而(5.to_f)之前浮动

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 
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