1. 程式人生 > >Exact Change

Exact Change

題目

設計一個收銀程式 checkCashRegister() ,其把購買價格(price)作為第一個引數 , 付款金額 (cash)作為第二個引數, 和收銀機中零錢 (cid) 作為第三個引數.

cid 是一個二維陣列,存著當前可用的找零.

當收銀機中的錢不夠找零時返回字串 “Insufficient Funds”. 如果正好則返回字串 “Closed”.

否則, 返回應找回的零錢列表,且由大到小存在二維陣列中

要求

checkCashRegister(19.50, 20.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]
) 應該返回一個數組. checkCashRegister(19.50, 20.00, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) 應該返回一個字串. checkCashRegister(19.50, 20.00, [["PENNY", 0.50], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]
) 應該返回一個字串. checkCashRegister(19.50, 20.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]) 應該返回 [["QUARTER", 0.50]]. checkCashRegister(3.26, 100.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]
) 應該返回 [["TWENTY", 60.00], ["TEN", 20.00], ["FIVE", 15], ["ONE", 1], ["QUARTER", 0.50], ["DIME", 0.20], ["PENNY", 0.04]]. checkCashRegister(19.50, 20.00, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) 應該返回 "Insufficient Funds". checkCashRegister(19.50, 20.00, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 1.00], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) 應該返回 "Insufficient Funds". checkCashRegister(19.50, 20.00, [["PENNY", 0.50], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) 應該返回 "Closed".

程式碼

function checkCashRegister(price, cash, cid) {
  var type_list = [{ type: 'ONE HUNDRED', val: 100.00},
                  { type: 'TWENTY', val: 20.00},
                  { type: 'TEN', val: 10.00},
                  { type: 'FIVE', val: 5.00}, 
                  { type: 'ONE', val: 1.00},
                  { type: 'QUARTER', val: 0.25},
                  { type: 'DIME', val: 0.10},
                  { type: 'NICKEL', val: 0.05}, 
                  { type: 'PENNY', val: 0.01}];

  var change = cash - price ;
  var total = cid.reduce(function(sum,val) {
    sum = sum + val[1];
    sum = Math.round(sum*100) / 100;
    return sum;
  },0);
  if(total === change) {
    return "Closed";
  }
  if(total < change) {
    return "Insufficient Funds";
  }
  var cid_list = cid.reduce(function(prev,curr) {
    prev[curr[0]] = curr[1];
    return prev;
  },{});
  var temp = change;
  var result = type_list.reduce(function(prev,curr) {
    var val = 0;
    while(cid_list[curr.type] > 0 && change >= curr.val){
      change -= curr.val;
      cid_list[curr.type] -= curr.val;
      val += curr.val;
      change = Math.round(change*100) / 100;
    }
    if(val) {
      prev.push([curr.type,val]);
    }
    return prev;
  },[]);
  if(change) {
    return "Insufficient Funds";
  }
  return result;
}
// Example cash-in-drawer array:
// [["PENNY", 1.01],
// ["NICKEL", 2.05],
// ["DIME", 3.10],
// ["QUARTER", 4.25],
// ["ONE", 90.00],
// ["FIVE", 55.00],
// ["TEN", 20.00],
// ["TWENTY", 60.00],
// ["ONE HUNDRED", 100.00]]

checkCashRegister(19.50, 20.00, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 1.00], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]);