原題:
Design a cash register drawer function
checkCashRegister()
that accepts purchase price as the first argument (
price
), payment as the second argument (
cash
), and cash-in-drawer (
cid
) as the third argument.
cid
is a 2D array listing available currency.
The
checkCashRegister()
function should always return an object with a
status
key and a
change
key.
為幫助了解,提供正确的輸入與輸出對如下:
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]]) should return an 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]]) should return {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]]) should return {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", 1], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) should return {status: "INSUFFICIENT_FUNDS", change: []}.
請先自行練習,以下為本人編碼,略長,僅供參考。
function checkCashRegister(price, cash, cid) {
var change = [];
var output = {
status : '',
change : []
}
// checkout how much money in total for a 2D array
function sumAllChanges(arr){
var sum = 0;
for(let i=0 ; i< arr.length;i++){
sum += arr[i][1];
}
return sum;
}
var changeDue = cash - price;
var cashierBalance = sumAllChanges(cid);
// 3 conditions
if(cashierBalance - changeDue == 0){
output.status = 'CLOSED'
output.change = cid;
return output;
}
else if (cashierBalance - changeDue < 0){
output.status = 'INSUFFICIENT_FUNDS';
return output;
}
else {
var currArr = [[100, 0],[20, 0],[10, 0],[5, 0],[1, 0],[0.25, 0],[0.1, 0],[0.05, 0],[0.01,0]];
let j = 0;
while(changeDue && j < currArr.length){
let changeCalculated = parseInt((changeDue*100)/(currArr[j][0]*100));
//for certain currency unit, changeAvailable means available units from cid
let changeAvailable = parseInt((cid[currArr.length-1-j][1]*100)/(currArr[j][0]*100));
currArr[j][1] = Math.min(changeAvailable,changeCalculated);
changeDue -= currArr[j][0] * currArr[j][1];
//!!! this is where error comes from !!!
changeDue = changeDue.toFixed(2);
if(currArr[j][1]) {
let temp=[];
temp[0] = cid[currArr.length-1-j][0];
temp[1] = currArr[j][1]*currArr[j][0];
output.change.push(temp);
}
j++;
}
if(sumAllChanges(output.change) < changeDue){
output.status = 'INSUFFICIENT_FUNDS';
output.change = [];
} else output.status = 'OPEN';
return output;
}
}
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]]);