2021-02-06 04:42:36 +00:00
---
id: aa2e6f85cab2ab736c9a9b24
2021-03-08 07:28:46 -07:00
title: Caja registradora
2021-02-06 04:42:36 +00:00
challengeType: 5
forumTopicId: 16012
dashedName: cash-register
---
# --description--
2021-03-08 07:28:46 -07:00
Diseña una función `checkCashRegister()` que acepte el precio de compra como primer argumento (`price` ), la cantidad pagada como segundo argumento (`cash` ), y el dinero en efectivo que tiene la caja (`cid` ) como tercer argumento.
2021-02-06 04:42:36 +00:00
2021-03-08 07:28:46 -07:00
`cid` es un arreglo 2D que enumera las monedas disponibles.
2021-02-06 04:42:36 +00:00
2021-03-08 07:28:46 -07:00
La función `checkCashRegister()` siempre debe devolver un objeto con una clave `status` y una clave `change` .
2021-02-06 04:42:36 +00:00
2021-03-08 07:28:46 -07:00
Devuelve `{status: "INSUFFICIENT_FUNDS", change: []}` si el efectivo en caja es menor que el cambio necesario, o si no puedes devolver el cambio exacto.
2021-02-06 04:42:36 +00:00
2021-03-08 07:28:46 -07:00
Devuelve `{status: "CLOSED", change: [...]}` si el efectivo en caja como valor de la clave `change` es igual al cambio que se debe entregar.
2021-02-06 04:42:36 +00:00
2021-03-08 07:28:46 -07:00
En cualquier otro caso, devuelve `{status: "OPEN", change: [...]}` , con el cambio a entregar en monedas y billetes, ordenados de mayor a menor, como valor de la clave `change` .
2021-02-06 04:42:36 +00:00
2021-03-08 07:28:46 -07:00
< table class = 'table table-striped' > < tbody > < tr > < th > Unidad Monetaria< / th > < th > Importe< / 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-02-06 04:42:36 +00:00
2021-03-08 07:28:46 -07:00
A continuación, un ejemplo del efectivo en caja en formato de arreglo:
2021-02-06 04:42:36 +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]
]
```
# --hints--
2021-03-08 07:28:46 -07: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]])` debe devolver un objeto.
2021-02-06 04:42:36 +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]'
);
```
2021-03-08 07:28:46 -07: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]])` debe devolver `{status: "OPEN", change: [["QUARTER", 0.5]]}` .
2021-02-06 04:42:36 +00:00
```js
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]] }
);
```
2021-03-08 07:28:46 -07: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]])` debe devolver `{status: "OPEN", change: [["TWENTY", 60], ["TEN", 20], ["FIVE", 15], ["ONE", 1], ["QUARTER", 0.5], ["DIME", 0.2], ["PENNY", 0.04]]}` .
2021-02-06 04:42:36 +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]
]
}
);
```
2021-03-08 07:28:46 -07: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]])` debe devolver `{status: "INSUFFICIENT_FUNDS", change: []}` .
2021-02-06 04:42:36 +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: [] }
);
```
2021-03-08 07:28:46 -07: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]])` debe devolver `{status: "INSUFFICIENT_FUNDS", change: []}` .
2021-02-06 04:42:36 +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: [] }
);
```
2021-03-08 07:28:46 -07: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]])` debe devolver `{status: "CLOSED", change: [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]}` .
2021-02-06 04:42:36 +00:00
```js
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]
]
}
);
```
# --seed--
## --seed-contents--
```js
function checkCashRegister(price, cash, cid) {
2021-10-27 15:10:57 +00:00
let change;
2021-02-06 04:42:36 +00:00
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]]);
```
# --solutions--
```js
2021-10-27 15:10:57 +00:00
const 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 },
2021-02-06 04:42:36 +00:00
];
function checkCashRegister(price, cash, cid) {
2021-10-27 15:10:57 +00:00
const output = { status: null, change: [] };
let change = cash - price;
const 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;
}
const change_arr = denom.reduce(function (acc, curr) {
let 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;
2021-02-06 04:42:36 +00:00
}
```