Skip to content

Instantly share code, notes, and snippets.

@michaelmrose
Created February 4, 2016 12:55
Show Gist options
  • Save michaelmrose/879ecb7590db9045aa10 to your computer and use it in GitHub Desktop.
Save michaelmrose/879ecb7590db9045aa10 to your computer and use it in GitHub Desktop.
open
var tender = {1: "PENNY", "PENNY": 1, 5: "NICKEL","NICKEL": 5, 10: "DIME", "DIME": 10, 25: "QUARTER", "QUARTER": 25,
100: "ONE","ONE": 100, 500: "FIVE", "FIVE": 500, 1000: "TEN", "TEN": 1000, 2000: "TWENTY",
"TWENTY": 2000, a10000: "ONE HUNDRED", "ONE HUNDRED": 10000};
function numberOfTender(value,cid,possibleChange){
var maxTender = possibleChange.filter(function(x){return x<=value;}).pop();
var maxNumTender = Math.floor(value/maxTender);
var tenderAvailable = cid.map(function(n){if (n[0] == tender[maxTender]) return n[1];})
.filter(notUndefined)
.map(Number) / (maxTender/100) || 0;
return [maxTender,Math.min(maxNumTender,tenderAvailable)];
}
function notUndefined(n){return n !== undefined;}
function monetize(n){return n * 100;}
function secondColumn(value){return value[1];}
function sum(x,y){return x + y;}
function drawer(price, cash, cid) {
price = price * 100;
cash = cash * 100;
var change = cash - price;
var till = cid.map(secondColumn).map(monetize).reduce(sum);
if (change == till) return "Closed";
return formatChange(makeChange(change,cid)) || "Insufficient Funds";
}
function makeChange(remaining,cid){//returns an array consisting of [value of tender,number of coins]
var possibleChange = cid.map(function(value,index) { return value[0]; }).map(function(name){return tender[name];});
result = [];
while (remaining > 0){
var tenderInfo = numberOfTender(remaining,cid,possibleChange);
result.push(tenderInfo);
remaining -= (tenderInfo[0] * tenderInfo[1]);
var ndx = possibleChange.indexOf(tenderInfo[0]);
if (ndx == -1)//we have run out of change to use without finishing
return false;
possibleChange = possibleChange.slice(0,ndx);
}
return result;
}
function formatChange(arr){//returns an array consisting of [tender name,value]
for(var i=0;i<arr.length;i++){
var coinName = tender[arr[i][0]];
var coinValue = arr[i][0] / 100 * arr[i][1];
arr[i] = [coinName,coinValue];
}
return arr;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment