--- id: aa2e6f85cab2ab736c9a9b24 title: Caixa registradora challengeType: 5 forumTopicId: 16012 dashedName: cash-register --- # --description-- Implemente uma função de caixa registradora `checkCashRegister()` que aceita o preço de compra como o primeiro argumento (`price`), pagamento como o segundo argumento (`cash`) e dinheiro na registradora (`cid`) como o terceiro argumento. `cid` é um array de duas dimensões listando a moeda disponível e a quantidade. A função `checkCashRegister()` deve sempre retornar um objeto com a chave `status` e uma chave `change`. Retorne `{status: "INSUFFICIENT_FUNDS", change: []}` se o dinheiro no caixa for menor que o troco devido, ou se você não pode retornar o troco exato. Retorne `{status: "CLOSED", change: [...]}` com dinheiro no caixa como o valor para a chave `change` se for igual ao troco devido. Caso contrário, retorne `{status: "OPEN", change: [...]}`, com o troco devido em moedas e notas, ordenado do maior para o menor, como o valor da chave `change`.
Unidade de moedaQuantidade
Penny$0,01 (PENNY)
Nickel$0,05 (NICKEL)
Dime$0,1 (DIME)
Quarter$0,25 (QUARTER)
Dólar$1 (ONE)
Cinco dólares$5 (FIVE)
Dez dólares$10 (TEN)
Vinte dólares$20 (TWENTY)
Cem dólares$100 (ONE HUNDRED)
Veja abaixo um exemplo de um array de dinheiro no caixa (cid): ```js [ ["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100] ] ``` # --hints-- `checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]])` deve retornar um objeto. ```js assert.deepEqual( Object.prototype.toString.call( checkCashRegister(19.5, 20, [ ['PENNY', 1.01], ['NICKEL', 2.05], ['DIME', 3.1], ['QUARTER', 4.25], ['ONE', 90], ['FIVE', 55], ['TEN', 20], ['TWENTY', 60], ['ONE HUNDRED', 100] ]) ), '[object Object]' ); ``` `checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]])` deve retornar `{status: "OPEN", change: [["QUARTER", 0.5]]}`. ```js assert.deepEqual( checkCashRegister(19.5, 20, [ ['PENNY', 1.01], ['NICKEL', 2.05], ['DIME', 3.1], ['QUARTER', 4.25], ['ONE', 90], ['FIVE', 55], ['TEN', 20], ['TWENTY', 60], ['ONE HUNDRED', 100] ]), { status: 'OPEN', change: [['QUARTER', 0.5]] } ); ``` `checkCashRegister(3.26, 100, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]])` deve retornar `{status: "OPEN", change: [["TWENTY", 60], ["TEN", 20], ["FIVE", 15], ["ONE", 1], ["QUARTER", 0.5], ["DIME", 0.2], ["PENNY", 0.04]]}`. ```js assert.deepEqual( checkCashRegister(3.26, 100, [ ['PENNY', 1.01], ['NICKEL', 2.05], ['DIME', 3.1], ['QUARTER', 4.25], ['ONE', 90], ['FIVE', 55], ['TEN', 20], ['TWENTY', 60], ['ONE HUNDRED', 100] ]), { status: 'OPEN', change: [ ['TWENTY', 60], ['TEN', 20], ['FIVE', 15], ['ONE', 1], ['QUARTER', 0.5], ['DIME', 0.2], ['PENNY', 0.04] ] } ); ``` `checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])` deve retornar `{status: "INSUFFICIENT_FUNDS", change: []}`. ```js assert.deepEqual( checkCashRegister(19.5, 20, [ ['PENNY', 0.01], ['NICKEL', 0], ['DIME', 0], ['QUARTER', 0], ['ONE', 0], ['FIVE', 0], ['TEN', 0], ['TWENTY', 0], ['ONE HUNDRED', 0] ]), { status: 'INSUFFICIENT_FUNDS', change: [] } ); ``` `checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 1], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])` deve retornar `{status: "INSUFFICIENT_FUNDS", change: []}`. ```js assert.deepEqual( checkCashRegister(19.5, 20, [ ['PENNY', 0.01], ['NICKEL', 0], ['DIME', 0], ['QUARTER', 0], ['ONE', 1], ['FIVE', 0], ['TEN', 0], ['TWENTY', 0], ['ONE HUNDRED', 0] ]), { status: 'INSUFFICIENT_FUNDS', change: [] } ); ``` `checkCashRegister(19.5, 20, [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])` deve retornar `{status: "CLOSED", change: [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]}`. ```js assert.deepEqual( checkCashRegister(19.5, 20, [ ['PENNY', 0.5], ['NICKEL', 0], ['DIME', 0], ['QUARTER', 0], ['ONE', 0], ['FIVE', 0], ['TEN', 0], ['TWENTY', 0], ['ONE HUNDRED', 0] ]), { status: 'CLOSED', change: [ ['PENNY', 0.5], ['NICKEL', 0], ['DIME', 0], ['QUARTER', 0], ['ONE', 0], ['FIVE', 0], ['TEN', 0], ['TWENTY', 0], ['ONE HUNDRED', 0] ] } ); ``` # --seed-- ## --seed-contents-- ```js function checkCashRegister(price, cash, cid) { var change; return change; } checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]); ``` # --solutions-- ```js var denom = [ { name: 'ONE HUNDRED', val: 100}, { name: 'TWENTY', val: 20}, { name: 'TEN', val: 10}, { name: 'FIVE', val: 5}, { name: 'ONE', val: 1}, { name: 'QUARTER', val: 0.25}, { name: 'DIME', val: 0.1}, { name: 'NICKEL', val: 0.05}, { name: 'PENNY', val: 0.01} ]; function checkCashRegister(price, cash, cid) { var output = {status: null, change: []}; var change = cash - price; var register = cid.reduce(function(acc, curr) { acc.total += curr[1]; acc[curr[0]] = curr[1]; return acc; }, {total: 0}); if(register.total === change) { output.status = 'CLOSED'; output.change = cid; return output; } if(register.total < change) { output.status = 'INSUFFICIENT_FUNDS'; return output; } var change_arr = denom.reduce(function(acc, curr) { var value = 0; while(register[curr.name] > 0 && change >= curr.val) { change -= curr.val; register[curr.name] -= curr.val; value += curr.val; change = Math.round(change * 100) / 100; } if(value > 0) { acc.push([ curr.name, value ]); } return acc; }, []); if(change_arr.length < 1 || change > 0) { output.status = 'INSUFFICIENT_FUNDS'; return output; } output.status = 'OPEN'; output.change = change_arr; return output; } ```