2016-12-28 3 views
0

Это Кодекс войны ката: Vending MachineТорговый автомат не возвращает изменения

Здесь я пытаюсь моделировать автомат. До сих пор я могу вернуть монеты, если вложенных кредитов недостаточно, и я могу заставить машину рассказать мне, сколько изменений необходимо, но я не могу заставить его вернуть изменения.

Изменение должно быть возвращено как объект в зависимости от монеты, которыми располагает торговый автомат.

//if this.coins = {1:1, 2:0, 4:3, 6:2} 
//and the change needed is 8 
//the change should be changeObj = {1: 1, 6: 1} 
//the machine is sneaky and can return less than the required amount, but not more. 

Здесь цикл для вычисления изменения и возврата объекта изменения работает должным образом.

let vmCoins = {1:1, 2:0, 4:3, 6:2} 
 
let changeObj = {} 
 
let changeNeeded = 8 
 

 
for (let d=changeNeeded; d>0; d--){ 
 
\t while (vmCoins[d]>0 && (changeNeeded-d)>=0){ 
 
    \t changeObj[d] ? changeObj[d] ++ : changeObj[d] = 1 
 
    vmCoins[d] -- 
 
    changeNeeded -= d 
 
    } 
 
} 
 

 
console.log(changeObj)

Но когда я положил его в основной раствор, кажется, не цикл для запуска.

function VendingMachine(coins){ 
 
    this.coins = coins 
 
} 
 

 
VendingMachine.prototype.vending = function(price,credit){ 
 

 
//Calculate total value of coins inserted 
 
    var changeObj = {} 
 
    let totalCredit =[] 
 
    let arrKeys = Object.keys(credit).map(x=>parseInt(x)) 
 
    let arrValues = Object.values(credit) 
 
    for (var i=0; i<arrKeys.length; i++){ 
 
    \t totalCredit.push(arrKeys[i]*arrValues[i]) 
 
    } 
 
    totalCredit = totalCredit.reduce((a,b) => a+b) 
 
    
 
//if coins inserted less than price, return the inserted coins 
 
    if (totalCredit<price){ 
 
    \t return credit 
 
    } 
 
    
 
//if coins inserted more than item price, put coins into vending machine & return change. 
 

 

 
if (totalCredit>price){ 
 
    \t arrKeys.forEach(x => this.coins[x] += credit[x])// put coins in vending machine 
 
    \t changeNeeded = totalCredit - price 
 
    // PROBLEM BEGINS HERE 
 
    for(let d=changeNeeded; d<0; d--){ 
 
    \t while(this.coins[d]>0 && (changeNeeded - d)>=0){ 
 
     \t changeObj[d] ? changeObj[d] ++ : changeObj[d] = 1 
 
     this.coins[d]-- 
 
     changeNeeded -=d 
 
     } 
 
    } 
 
    return changeObj //does not return as expected 
 
    } 
 
} 
 

 

 
let vm = new VendingMachine({1:1, 2:0, 4:3, 6:2}) 
 

 
let result = vm.vending(12, {2:1, 6:3}) 
 
console.log(vm) //check if the credit is put into the machine (yes) 
 
console.log(result)// returns empty object

Как получить программу, чтобы вернуть объект изменения?

+1

В рабочей версии у вас есть 'd> 0', но вы изменили ее на' d <0' в нерабочей версии. Это было намеренно? – Barmar

+0

* вздох * была ошибка. Работает сейчас ... –

ответ

0

Я думаю, что проблема - это условие цикла. На самом деле, у вас есть:

for (let d=changeNeeded; d<0; d--){ 

Но вы хотите, чтобы цикл уменьшения d (изменение) в течение долгого времени. Таким образом, ваше состояние должно измениться в противоположную сторону (с помощью > и не <):

for (let d = changeNeeded; d > 0; d--){ 

Я надеюсь, что это будет достаточно.

Смежные вопросы