Let us begin with an example:

A man has a rather old car being worth $2000. 
He saw a secondhand car being worth $8000. He wants to keep his old car until he can buy the secondhand one.

He thinks he can save $1000 each month but the prices of his old 
car and of the new one decrease of 1.5 percent per month.
Furthermore this percent of loss increases of `0.5` percent 
at the end of every two months.
Our man finds it difficult to make all these calculations.

**Can you help him?**

How many months will it take him to save up enough money to buy the car he wants, and how much money will he have left over?

**Parameters and return of function:**
```
parameter (positive int or float, guaranteed) startPriceOld (Old car price)
parameter (positive int or float, guaranteed) startPriceNew (New car price)
parameter (positive int or float, guaranteed) savingperMonth 
parameter (positive float or int, guaranteed) percentLossByMonth

nbMonths(2000, 8000, 1000, 1.5) should return [6, 766] or (6, 766)
```
###  Detail of the above example:
```
end month 1: percentLoss 1.5 available -4910.0
end month 2: percentLoss 2.0 available -3791.7999...
end month 3: percentLoss 2.0 available -2675.964
end month 4: percentLoss 2.5 available -1534.06489...
end month 5: percentLoss 2.5 available -395.71327...
end month 6: percentLoss 3.0 available 766.158120825...
return [6, 766] or (6, 766)

```

where `6` is the number of months at **the end of which** he can buy the new car and `766` is the nearest integer to `766.158...` (rounding `766.158` gives `766`).

**Note:** 

Selling, buying and saving are normally done at end of month.
Calculations are processed at the end of each considered month
but if, by chance from the start, the value of the old car is bigger than the value of the new one or equal there is no saving to be made, no need to wait so he can at the beginning of the month buy the new car:
```
nbMonths(12000, 8000, 1000, 1.5) should return [0, 4000]
nbMonths(8000, 8000, 1000, 1.5) should return [0, 0]
```

We don't take care of a deposit of savings in a bank:-)

Source: codewars | Difficulty: EASY
Tags: Fundamentals

Mathematics

Starter code: def nbMonths(startPriceOld, startPriceNew, savingperMonth, percentLossByMonth):
	

Solutions:
def nbMonths(oldCarPrice, newCarPrice, saving, loss):
	months = 0
	budget = oldCarPrice
	while budget < newCarPrice:
		months += 1
		if months % 2 == 0:
			loss += 0.5
		oldCarPrice *= (100 - loss) / 100
		newCarPrice *= (100 - loss) / 100
		budget = saving * months + oldCarPrice
	return [months, round(budget - newCarPrice)]


def nbMonths(startPriceOld, startPriceNew, savingperMonth, percentLossByMonth):
	i = 0
	while savingperMonth * i + startPriceOld < startPriceNew:
		if i % 2:
			percentLossByMonth += 0.5
		startPriceOld -= startPriceOld * 0.01 * percentLossByMonth
		startPriceNew -= startPriceNew * 0.01 * percentLossByMonth
		i += 1
	return [i, round(savingperMonth * i + startPriceOld - startPriceNew)]


def nbMonths(fltp1, fltp2, flts, fltl, i=0):
	return [i, round(fltp1 + flts * i - fltp2, 0)] if fltp1 + flts * i - fltp2 >= 0 else nbMonths(fltp1 * (1 - fltl / 100 - 0.005 * int((i + 1) / 2)), fltp2 * (1 - fltl / 100 - 0.005 * int((i + 1) / 2)), flts, fltl, i + 1)


import itertools

def nbMonths(my_car, new_car, per_month, loss):
	(loss, w, m) = (1 - loss / 100.0, my_car, 0)
	while w < new_car:
		loss -= 0 if m % 2 == 0 else 0.005
		my_car *= loss
		new_car *= loss
		m += 1
		w = my_car + per_month * m
	return [m, round(w - new_car)]


def nbMonths(startPriceOld, startPriceNew, savingperMonth, percentLossByMonth):
	total = 0
	count = 0
	while total + startPriceOld < startPriceNew:
		count += 1
		if count and count % 2 == 0:
			percentLossByMonth += 0.5
		startPriceOld = startPriceOld * (100 - percentLossByMonth) / 100
		startPriceNew = startPriceNew * (100 - percentLossByMonth) / 100
		total += savingperMonth
	return [count, round(total + startPriceOld - startPriceNew)]


def nbMonths(priceOld, priceNew, savingMonth, percentLoss):
	if priceOld > priceNew:
		return [0, priceOld - priceNew]
	months = 0
	savings = 0
	loss = percentLoss / 100
	while savings + priceOld < priceNew:
		months += 1
		savings += savingMonth
		if months % 2 == 0:
			loss += 0.005
		priceOld -= priceOld * loss
		priceNew -= priceNew * loss
	saved = round(savings + priceOld - priceNew)
	return [months, saved]


def nbMonths(startPriceOld, startPriceNew, savingperMonth, percentLossByMonth):
	months_elapsed = 0
	if startPriceOld >= startPriceNew:
		return [months_elapsed, startPriceOld - startPriceNew]
	too_poor = True
	while too_poor:
		months_elapsed += 1
		if months_elapsed % 2 == 0:
			percentLossByMonth += 0.5
		startPriceOld = startPriceOld * (1 - percentLossByMonth / 100)
		startPriceNew = startPriceNew * (1 - percentLossByMonth / 100)
		available_funds = startPriceOld + savingperMonth * months_elapsed
		if available_funds >= startPriceNew:
			too_poor = False
	return [months_elapsed, int(round(available_funds - startPriceNew))]