From eceea49417cf3048b8a2ea474bbc487620bbc924 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Salgado?= Date: Fri, 15 Oct 2021 14:59:16 +0100 Subject: [PATCH] fix: makeChangeDynamic --- lib/bill-math.js | 96 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 68 insertions(+), 28 deletions(-) diff --git a/lib/bill-math.js b/lib/bill-math.js index b665840a..960868ef 100644 --- a/lib/bill-math.js +++ b/lib/bill-math.js @@ -48,37 +48,77 @@ function makeChangeDuo (cassettes, amount) { } function makeChangeDynamic (cassettes, amount) { - const cassetteMap = _.map(cassettes, it => ({ - denomination: it.denomination - })) + while (_.size(cassettes) < 4) { + cassettes.push({ denomination: 0, count: 0 }) + } + + const solutions = [] const amountNum = amount.toNumber() - - const sortedCassettes = _.orderBy(cassetteMap, ['denomination'], ['desc']) - - const finalDist = [] - - let mutableAmount = _.clone(amountNum) - - while(mutableAmount >= 0) { - _.each(sortedCassettes, it => { - if (mutableAmount === 0) { - finalDist.push({ provisioned: 0, denomination: it.denomination, id: uuid.v4() }) - return + for (let i = 0; i * cassettes[0].denomination <= amountNum; i++) { + for ( + let j = 0; + i * cassettes[0].denomination + j * cassettes[1].denomination <= + amountNum; + j++ + ) { + for ( + let k = 0; + i * cassettes[0].denomination + + j * cassettes[1].denomination + + k * cassettes[2].denomination <= + amountNum; + k++ + ) { + for ( + let l = 0; + i * cassettes[0].denomination + + j * cassettes[1].denomination + + k * cassettes[2].denomination + + l * cassettes[3].denomination <= + amountNum; + l++ + ) { + if ( + i * cassettes[0].denomination + + j * cassettes[1].denomination + + k * cassettes[2].denomination + + l * cassettes[3].denomination === + amountNum && + i <= cassettes[0].count && + j <= cassettes[1].count && + k <= cassettes[2].count && + l <= cassettes[3].count && i > 0 && j > 0 && k > 0 && l > 0 + ) { + solutions.push([ + { + provisioned: i, + denomination: cassettes[0].denomination, + id: uuid.v4() + }, + { + provisioned: j, + denomination: cassettes[1].denomination, + id: uuid.v4() + }, + { + provisioned: k, + denomination: cassettes[2].denomination, + id: uuid.v4() + }, + { + provisioned: l, + denomination: cassettes[3].denomination, + id: uuid.v4() + } + ]) + } + } } - - const remainder = mutableAmount % it.denomination - const amountToSub = mutableAmount - remainder - const numberOfBills = amountToSub / it.denomination - mutableAmount -= amountToSub - - finalDist.push({ provisioned: numberOfBills, denomination: it.denomination, id: uuid.v4() }) - return - }) - - if (mutableAmount === 0) { - break } } - return finalDist + const sortedSolutions = _.sortBy(solutions, it => { + _.reduce(it, (acc, value) => acc + value.provisioned, 0) + }) + return _.head(sortedSolutions) }