9.8 KiB
title | localeTitle |
---|---|
Cash Register | Кассовый аппарат |
Не забудьте использовать Read-Search-Ask
если вы застряли. Попробуйте подключить программу и напишите свой собственный код
Проблема Объяснение:
- Вам нужно создать программу, которая вернет объект, содержащий ключ
status
ключchange
. Значениеstatus
- это строкаINSUFFICIENT_FUNDS
,CLOSED
илиOPEN
, а значениеchange
- это 2D-массив изменения.
Связанные ссылки
- Массивы структуры данных
Подсказка: 1
- Это легче, когда вы знаете, сколько денег в вашем регистре заранее. Для этого рекомендуется иметь функцию для назначения этой информации переменной. Затем вы можете увидеть, есть ли у вас достаточно денег для завершения транзакции и возврата изменений, или если вы должны закрыть регистр.
попытаться решить проблему сейчас
Подсказка: 2
- Эта проблема проще, когда вы знаете ценность каждого купюра или монеты, с которой работаете, а не просто сумму каждого в регистре. Например, полезно знать, что никель стоит 0,05, а также тот факт, что у вас в кассе есть никель в размере 2,05 доллара.
попытаться решить проблему сейчас
Подсказка: 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]]);
Код Объяснение:
Сначала создайте массив объектов со значением каждого номинала купюры или монеты вместе с выходным объектом со статусом и клавишами изменения. Затем преобразуйте массив CID в объект ящика. Затем обрабатывайте условия точного изменения и недостаточные средства. Проведите цикл через массив denom
и обновите изменения и значения, пока в ящике все еще есть деньги каждого типа, а номинал больше оставшегося изменения. Добавьте этот деноминат в аккумулятор change_arr
если какой-либо из этих типов был использован. После цикла change_arr
представляет собой 2D-массив изменения из-за, отсортированный от наивысшего до наименьшего наименования. Если в change_arr
нет элементов, или вы все еще должны изменить, верните выходной объект со статусом INSUFFICIENT_FUNDS
. Наконец, вы можете внести правильные изменения. Вернуть выходной объект со статусом OPEN
и change_arr
как значение изменения.
Связанные ссылки
ПРИМЕЧАНИЯ ДЛЯ ВЗНОСОВ:
- НЕ добавляйте решения, похожие на любые существующие решения. Если вы считаете, что это похоже, но лучше , попробуйте объединить (или заменить) существующее подобное решение.
- Добавьте объяснение своего решения.
- Классифицируйте решение в одной из следующих категорий - Basic , Intermediate и Advanced .
- Пожалуйста, добавьте свое имя пользователя, только если вы добавили соответствующее основное содержимое . ( НЕ удаляйте существующие имена пользователей )
Увидеть
Wiki Challenge Solution Template
дляWiki Challenge Solution Template
для справки.