2018-10-10 22:03:03 +00:00
---
id: aa2e6f85cab2ab736c9a9b24
2021-02-06 04:42:36 +00:00
title: Cash Register
2018-10-10 22:03:03 +00:00
challengeType: 5
2020-09-07 08:17:22 +00:00
forumTopicId: 16012
2021-01-13 02:31:00 +00:00
dashedName: cash-register
2018-10-10 22:03:03 +00:00
---
2020-12-16 07:37:30 +00:00
# --description--
2018-10-10 22:03:03 +00:00
2021-02-06 04:42:36 +00:00
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.
2020-12-16 07:37:30 +00:00
2021-02-06 04:42:36 +00:00
`cid` is a 2D array listing available currency.
2020-12-16 07:37:30 +00:00
2021-02-06 04:42:36 +00:00
The `checkCashRegister()` function should always return an object with a `status` key and a `change` key.
2020-12-16 07:37:30 +00:00
2021-02-06 04:42:36 +00:00
Return `{status: "INSUFFICIENT_FUNDS", change: []}` if cash-in-drawer is less than the change due, or if you cannot return the exact change.
2020-12-16 07:37:30 +00:00
2021-02-06 04:42:36 +00:00
Return `{status: "CLOSED", change: [...]}` with cash-in-drawer as the value for the key `change` if it is equal to the change due.
2020-12-16 07:37:30 +00:00
2021-02-06 04:42:36 +00:00
Otherwise, return `{status: "OPEN", change: [...]}` , with the change due in coins and bills, sorted in highest to lowest order, as the value of the `change` key.
2020-12-16 07:37:30 +00:00
2021-02-06 04:42:36 +00:00
< table class = 'table table-striped' > < tbody > < tr > < th > Currency Unit< / th > < th > Amount< / th > < / tr > < tr > < td > Penny< / td > < td > $0.01 (PENNY)< / td > < / tr > < tr > < td > Nickel< / td > < td > $0.05 (NICKEL)< / td > < / tr > < tr > < td > Dime< / td > < td > $0.1 (DIME)< / td > < / tr > < tr > < td > Quarter< / td > < td > $0.25 (QUARTER)< / td > < / tr > < tr > < td > Dollar< / td > < td > $1 (ONE)< / td > < / tr > < tr > < td > Five Dollars< / td > < td > $5 (FIVE)< / td > < / tr > < tr > < td > Ten Dollars< / td > < td > $10 (TEN)< / td > < / tr > < tr > < td > Twenty Dollars< / td > < td > $20 (TWENTY)< / td > < / tr > < tr > < td > One-hundred Dollars< / td > < td > $100 (ONE HUNDRED)< / td > < / tr > < / tbody > < / table >
2021-01-12 16:18:51 +00:00
2021-02-06 04:42:36 +00:00
See below for an example of a cash-in-drawer array:
2021-01-12 16:18:51 +00:00
```js
[
["PENNY", 1.01],
["NICKEL", 2.05],
["DIME", 3.1],
["QUARTER", 4.25],
["ONE", 90],
["FIVE", 55],
["TEN", 20],
["TWENTY", 60],
["ONE HUNDRED", 100]
]
```
2020-12-16 07:37:30 +00:00
# --hints--
2018-10-10 22:03:03 +00:00
2021-02-06 04:42:36 +00:00
`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.
2018-10-10 22:03:03 +00:00
2020-12-16 07:37:30 +00:00
```js
assert.deepEqual(
Object.prototype.toString.call(
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]
])
),
'[object Object]'
);
```
2018-10-10 22:03:03 +00:00
2021-02-06 04:42:36 +00:00
`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]]}` .
2018-10-10 22:03:03 +00:00
```js
2020-12-16 07:37:30 +00:00
assert.deepEqual(
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]
]),
{ status: 'OPEN', change: [['QUARTER', 0.5]] }
);
2018-10-10 22:03:03 +00:00
```
2021-02-06 04:42:36 +00:00
`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]]}` .
2020-12-16 07:37:30 +00:00
```js
assert.deepEqual(
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]
]),
{
status: 'OPEN',
change: [
['TWENTY', 60],
['TEN', 20],
['FIVE', 15],
['ONE', 1],
['QUARTER', 0.5],
['DIME', 0.2],
['PENNY', 0.04]
]
}
);
```
2018-10-10 22:03:03 +00:00
2021-02-06 04:42:36 +00:00
`checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])` should return `{status: "INSUFFICIENT_FUNDS", change: []}` .
2018-10-10 22:03:03 +00:00
2020-12-16 07:37:30 +00:00
```js
assert.deepEqual(
checkCashRegister(19.5, 20, [
['PENNY', 0.01],
['NICKEL', 0],
['DIME', 0],
['QUARTER', 0],
['ONE', 0],
['FIVE', 0],
['TEN', 0],
['TWENTY', 0],
['ONE HUNDRED', 0]
]),
{ status: 'INSUFFICIENT_FUNDS', change: [] }
);
```
2018-10-10 22:03:03 +00:00
2021-02-06 04:42:36 +00:00
`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: []}` .
2018-10-10 22:03:03 +00:00
2020-12-16 07:37:30 +00:00
```js
assert.deepEqual(
checkCashRegister(19.5, 20, [
['PENNY', 0.01],
['NICKEL', 0],
['DIME', 0],
['QUARTER', 0],
['ONE', 1],
['FIVE', 0],
['TEN', 0],
['TWENTY', 0],
['ONE HUNDRED', 0]
]),
{ status: 'INSUFFICIENT_FUNDS', change: [] }
);
```
2018-10-10 22:03:03 +00:00
2021-02-06 04:42:36 +00:00
`checkCashRegister(19.5, 20, [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])` should return `{status: "CLOSED", change: [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]}` .
2020-09-07 08:17:22 +00:00
2018-10-10 22:03:03 +00:00
```js
2020-12-16 07:37:30 +00:00
assert.deepEqual(
checkCashRegister(19.5, 20, [
['PENNY', 0.5],
['NICKEL', 0],
['DIME', 0],
['QUARTER', 0],
['ONE', 0],
['FIVE', 0],
['TEN', 0],
['TWENTY', 0],
['ONE HUNDRED', 0]
]),
{
status: 'CLOSED',
change: [
['PENNY', 0.5],
['NICKEL', 0],
['DIME', 0],
['QUARTER', 0],
['ONE', 0],
['FIVE', 0],
['TEN', 0],
['TWENTY', 0],
['ONE HUNDRED', 0]
]
}
);
2018-10-10 22:03:03 +00:00
```
2020-08-13 15:24:35 +00:00
2021-01-13 02:31:00 +00:00
# --seed--
## --seed-contents--
```js
function checkCashRegister(price, cash, cid) {
var change;
return change;
}
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]]);
```
2020-12-16 07:37:30 +00:00
# --solutions--
2021-01-13 02:31:00 +00:00
```js
var denom = [
{ name: 'ONE HUNDRED', val: 100},
{ name: 'TWENTY', val: 20},
{ name: 'TEN', val: 10},
{ name: 'FIVE', val: 5},
{ name: 'ONE', val: 1},
{ name: 'QUARTER', val: 0.25},
{ name: 'DIME', val: 0.1},
{ name: 'NICKEL', val: 0.05},
{ name: 'PENNY', val: 0.01}
];
function checkCashRegister(price, cash, cid) {
var output = {status: null, change: []};
var change = cash - price;
var register = cid.reduce(function(acc, curr) {
acc.total += curr[1];
acc[curr[0]] = curr[1];
return acc;
}, {total: 0});
if(register.total === change) {
output.status = 'CLOSED';
output.change = cid;
return output;
}
if(register.total < change ) {
output.status = 'INSUFFICIENT_FUNDS';
return output;
}
var change_arr = denom.reduce(function(acc, curr) {
var value = 0;
while(register[curr.name] > 0 & & change >= curr.val) {
change -= curr.val;
register[curr.name] -= curr.val;
value += curr.val;
change = Math.round(change * 100) / 100;
}
if(value > 0) {
acc.push([ curr.name, value ]);
}
return acc;
}, []);
if(change_arr.length < 1 | | change > 0) {
output.status = 'INSUFFICIENT_FUNDS';
return output;
}
output.status = 'OPEN';
output.change = change_arr;
return output;
}
```