135 lines
9.8 KiB
Markdown
135 lines
9.8 KiB
Markdown
|
---
|
|||
|
title: Cash Register
|
|||
|
localeTitle: Кассовый аппарат
|
|||
|
---
|
|||
|
![:triangular_flag_on_post:](https://forum.freecodecamp.com/images/emoji/emoji_one/triangular_flag_on_post.png?v=3 ": Triangular_flag_on_post:") Не забудьте использовать **`Read-Search-Ask`** если вы застряли. Попробуйте подключить программу ![:busts_in_silhouette:](https://forum.freecodecamp.com/images/emoji/emoji_one/busts_in_silhouette.png?v=3 ": Busts_in_silhouette:") и напишите свой собственный код ![:pencil:](https://forum.freecodecamp.com/images/emoji/emoji_one/pencil.png?v=3 ":карандаш:")
|
|||
|
|
|||
|
### ![:checkered_flag:](https://forum.freecodecamp.com/images/emoji/emoji_one/checkered_flag.png?v=3 ": Checkered_flag:") Проблема Объяснение:
|
|||
|
|
|||
|
* Вам нужно создать программу, которая вернет объект, содержащий ключ `status` ключ `change` . Значение `status` - это строка `INSUFFICIENT_FUNDS` , `CLOSED` или `OPEN` , а значение `change` - это 2D-массив изменения.
|
|||
|
|
|||
|
#### Связанные ссылки
|
|||
|
|
|||
|
* Массивы структуры данных
|
|||
|
|
|||
|
## ![:speech_balloon:](https://forum.freecodecamp.com/images/emoji/emoji_one/speech_balloon.png?v=3 ": Speech_balloon:") Подсказка: 1
|
|||
|
|
|||
|
* Это легче, когда вы знаете, сколько денег в вашем регистре заранее. Для этого рекомендуется иметь функцию для назначения этой информации переменной. Затем вы можете увидеть, есть ли у вас достаточно денег для завершения транзакции и возврата изменений, или если вы должны закрыть регистр.
|
|||
|
|
|||
|
> _попытаться решить проблему сейчас_
|
|||
|
|
|||
|
## ![:speech_balloon:](https://forum.freecodecamp.com/images/emoji/emoji_one/speech_balloon.png?v=3 ": Speech_balloon:") Подсказка: 2
|
|||
|
|
|||
|
* Эта проблема проще, когда вы знаете ценность каждого купюра или монеты, с которой работаете, а не просто сумму каждого в регистре. Например, полезно знать, что никель стоит 0,05, а также тот факт, что у вас в кассе есть никель в размере 2,05 доллара.
|
|||
|
|
|||
|
> _попытаться решить проблему сейчас_
|
|||
|
|
|||
|
## ![:speech_balloon:](https://forum.freecodecamp.com/images/emoji/emoji_one/speech_balloon.png?v=3 ": Speech_balloon:") Подсказка: 3
|
|||
|
|
|||
|
* Вам нужно будет получить столько же изменений от одного типа счета или монеты, прежде чем переходить к следующему, от большего к меньшему. Продолжайте движение, пока вы не рассчитали все изменения.
|
|||
|
|
|||
|
> _попытаться решить проблему сейчас_
|
|||
|
|
|||
|
## Осторожно, спойлеры!
|
|||
|
|
|||
|
![предупреждающий знак](//discourse-user-assets.s3.amazonaws.com/original/2X/2/2d6c412a50797771301e7ceabd554cef4edcd74d.gif)
|
|||
|
|
|||
|
**Решение впереди!**
|
|||
|
|
|||
|
## ![:beginner:](https://forum.freecodecamp.com/images/emoji/emoji_one/beginner.png?v=3 ": Начинающий:") Решение для начинающего кода:
|
|||
|
```
|
|||
|
// Create an array of objects 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 checkCashRegister(price, cash, cid) {
|
|||
|
var output = { status: null, change: [] };
|
|||
|
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) {
|
|||
|
output.status = 'CLOSED';
|
|||
|
output.change = cid;
|
|||
|
return output;
|
|||
|
}
|
|||
|
|
|||
|
// Handle obvious insufficient funds
|
|||
|
if (register.total < change) {
|
|||
|
output.status = 'INSUFFICIENT_FUNDS';
|
|||
|
return output;
|
|||
|
}
|
|||
|
|
|||
|
// 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 remaining
|
|||
|
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 deals 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_arr
|
|||
|
}, []); // Initial value of empty array for reduce
|
|||
|
|
|||
|
// If there are no elements in change_arr or we have leftover change, return
|
|||
|
// the string "Insufficient Funds"
|
|||
|
if (change_arr.length < 1 || change > 0) {
|
|||
|
output.status = 'INSUFFICIENT_FUNDS';
|
|||
|
return output;
|
|||
|
}
|
|||
|
|
|||
|
// Here is your change, ma'am.
|
|||
|
output.status = 'OPEN';
|
|||
|
output.change = change_arr;
|
|||
|
return output;
|
|||
|
}
|
|||
|
|
|||
|
// test here
|
|||
|
checkCashRegister(19.50, 20.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]);
|
|||
|
```
|
|||
|
|
|||
|
![:rocket:](https://forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=3 ": Ракета:") [Код запуска](https://repl.it/@scissorsneedfoo/cash-register-example)
|
|||
|
|
|||
|
### Код Объяснение:
|
|||
|
|
|||
|
Сначала создайте массив объектов со значением каждого номинала купюры или монеты вместе с выходным объектом со статусом и клавишами изменения. Затем преобразуйте массив CID в объект ящика. Затем обрабатывайте условия точного изменения и недостаточные средства. Проведите цикл через массив `denom` и обновите изменения и значения, пока в ящике все еще есть деньги каждого типа, а номинал больше оставшегося изменения. Добавьте этот деноминат в аккумулятор `change_arr` если какой-либо из этих типов был использован. После цикла `change_arr` представляет собой 2D-массив изменения из-за, отсортированный от наивысшего до наименьшего наименования. Если в `change_arr` нет элементов, или вы все еще должны изменить, верните выходной объект со статусом `INSUFFICIENT_FUNDS` . Наконец, вы можете внести правильные изменения. Вернуть выходной объект со статусом `OPEN` и `change_arr` как значение изменения.
|
|||
|
|
|||
|
#### Связанные ссылки
|
|||
|
|
|||
|
* [Уменьшение массива JS](http://forum.freecodecamp.com/t/javascript-array-prototype-reduce/14299)
|
|||
|
* [JS упростит работу](http://forum.freecodecamp.com/t/using-array-prototype-reduce-to-reduce-conceptual-boilerplate-for-problems-on-arrays/14687)
|
|||
|
* [JS Loops](http://forum.freecodecamp.com/t/javascript-loops/14681)
|
|||
|
* [JS Array Push](http://forum.freecodecamp.com/t/javascript-array-prototype-push/14298)
|
|||
|
|
|||
|
## ![:clipboard:](https://forum.freecodecamp.com/images/emoji/emoji_one/clipboard.png?v=3 ": Буфер обмена:") ПРИМЕЧАНИЯ ДЛЯ ВЗНОСОВ:
|
|||
|
|
|||
|
* ![:warning:](https://forum.freecodecamp.com/images/emoji/emoji_one/warning.png?v=3 ":предупреждение:") **НЕ** добавляйте решения, похожие на любые существующие решения. Если вы считаете, что это **_похоже, но лучше_** , попробуйте объединить (или заменить) существующее подобное решение.
|
|||
|
* Добавьте объяснение своего решения.
|
|||
|
* Классифицируйте решение в одной из следующих категорий - **Basic** , **Intermediate** и **Advanced** . ![:traffic_light:](https://forum.freecodecamp.com/images/emoji/emoji_one/traffic_light.png?v=3 ":светофор:")
|
|||
|
* Пожалуйста, добавьте свое имя пользователя, только если вы добавили **соответствующее основное содержимое** . ( ![:warning:](https://forum.freecodecamp.com/images/emoji/emoji_one/warning.png?v=3 ":предупреждение:") **_НЕ_** _удаляйте существующие имена пользователей_ )
|
|||
|
|
|||
|
> Увидеть ![:point_right:](https://forum.freecodecamp.com/images/emoji/emoji_one/point_right.png?v=3 ": Point_right:") [**`Wiki Challenge Solution Template`**](http://forum.freecodecamp.com/t/algorithm-article-template/14272) для [**`Wiki Challenge Solution Template`**](http://forum.freecodecamp.com/t/algorithm-article-template/14272) для справки.
|