- You have to create a program that will handle when the register does not have enough cash or will have no cash after the transaction. Other than that it needs to return an array of the change in the form of an array, so that will be a 2D array.
- Is easier to handle if you will have to close the register or if you will not have enough money to complete the transaction if you know beforehand how much money is on your register. For this it would be recommended to have a function get the information assigned to a variable.
- Life is easier when you get to know the value of each currency type in the register instead of how much money is composed of that particular currency. So be sure to watch out for that.
- You will have to get as much change from one type before moving to the next from greater value to lesser, and keep going until you have covered the whole change.
Solution ahead!
// Create an object which hold the denominations and their values
var denom = [
{ name: 'ONE HUNDRED', val: 100.00},
{ name: 'TWENTY', val: 20.00},
{ name: 'TEN', val: 10.00},
{ name: 'FIVE', val: 5.00},
{ name: 'ONE', val: 1.00},
{ name: 'QUARTER', val: 0.25},
{ name: 'DIME', val: 0.10},
{ name: 'NICKEL', val: 0.05},
{ name: 'PENNY', val: 0.01}
];
function drawer(price, cash, cid) {
var change = cash - price;
// Transform CID array into drawer object
var register = cid.reduce(function(acc, curr) {
acc.total += curr[1];
acc[curr[0]] = curr[1];
return acc;
}, {total: 0});
// Handle exact change
if(register.total === change) {
return 'Closed';
}
// Handle obvious insufficent funds
if(register.total < change) {
return 'Insufficient Funds';
}
// Loop through the denomination array
var change_arr = denom.reduce(function(acc, curr) {
var value = 0;
// While there is still money of this type in the drawer
// And while the denomination is larger than the change reminaing
while(register[curr.name] > 0 && change >= curr.val) {
change -= curr.val;
register[curr.name] -= curr.val;
value += curr.val;
// Round change to the nearest hundreth to deal with precision errors
change = Math.round(change * 100) / 100;
}
// Add this denomination to the output only if any was used.
if(value > 0) {
acc.push([ curr.name, value ]);
}
return acc; // Return the current Change Array
}, []); // Initial value of empty array for reduce
// If there are no elements in change_arr or we have leftover change, return "Insufficient Funds"
if(change_arr.length < 1 || change > 0) {
return "Insufficient Funds";
}
// Here is your change, ma'am.
return change_arr;
}- Read comments in code.
If you found this page useful, you can give thanks by copying and pasting this on the main chat: thanks @Rafase282 @SaintPeter for your help with Algorithm: Exact Change
NOTE: Please add your username only if you have added any relevant main contents to the wiki page. (Please don't remove any existing usernames.)