Created
February 4, 2016 12:55
-
-
Save michaelmrose/879ecb7590db9045aa10 to your computer and use it in GitHub Desktop.
open
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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