From 03fc35e9d162a2ac0669681b9630645b04c9242f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Salgado?= Date: Fri, 15 Oct 2021 16:11:47 +0100 Subject: [PATCH] fix: edge cases on makeChangeDynamic --- lib/bill-math.js | 74 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/lib/bill-math.js b/lib/bill-math.js index 960868ef..5ac9358b 100644 --- a/lib/bill-math.js +++ b/lib/bill-math.js @@ -17,7 +17,7 @@ exports.makeChange = function makeChange (cassettes, amount) { // Example: Denominations: [3, 5, 10] | User inputs 4 times the [3] button, resulting in a 12 fiat tx // This algorithm resolves for 1 x [10], and can't resolve the remainder of 2 - return _.length(cassettes) > 2 ? makeChangeDynamic(cassettes, amount) : makeChangeDuo(cassettes, amount) + return _.size(cassettes) > 2 ? makeChangeDynamic(cassettes, amount) : makeChangeDuo(cassettes, amount) } function makeChangeDuo (cassettes, amount) { @@ -61,6 +61,37 @@ function makeChangeDynamic (cassettes, amount) { amountNum; j++ ) { + if (cassettes[1].denomination === 0) break + if ( + i * cassettes[0].denomination + + j * cassettes[1].denomination === + amountNum && + i <= cassettes[0].count && + j <= cassettes[1].count && i >= 0 && j >= 0 + ) { + solutions.push([ + { + provisioned: i, + denomination: cassettes[0].denomination, + id: uuid.v4() + }, + { + provisioned: j, + denomination: cassettes[1].denomination, + id: uuid.v4() + }, + { + provisioned: 0, + denomination: cassettes[2].denomination, + id: uuid.v4() + }, + { + provisioned: 0, + denomination: cassettes[3].denomination, + id: uuid.v4() + } + ]) + } for ( let k = 0; i * cassettes[0].denomination + @@ -69,6 +100,39 @@ function makeChangeDynamic (cassettes, amount) { amountNum; k++ ) { + if (cassettes[2].denomination === 0) break + if ( + i * cassettes[0].denomination + + j * cassettes[1].denomination + + k * cassettes[2].denomination === + amountNum && + i <= cassettes[0].count && + j <= cassettes[1].count && + k <= cassettes[2].count && i >= 0 && j >= 0 && k >= 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: 0, + denomination: cassettes[3].denomination, + id: uuid.v4() + } + ]) + } for ( let l = 0; i * cassettes[0].denomination + @@ -78,6 +142,7 @@ function makeChangeDynamic (cassettes, amount) { amountNum; l++ ) { + if (cassettes[3].denomination === 0) break if ( i * cassettes[0].denomination + j * cassettes[1].denomination + @@ -87,7 +152,7 @@ function makeChangeDynamic (cassettes, amount) { i <= cassettes[0].count && j <= cassettes[1].count && k <= cassettes[2].count && - l <= cassettes[3].count && i > 0 && j > 0 && k > 0 && l > 0 + l <= cassettes[3].count && i >= 0 && j >= 0 && k >= 0 && l >= 0 ) { solutions.push([ { @@ -120,5 +185,8 @@ function makeChangeDynamic (cassettes, amount) { const sortedSolutions = _.sortBy(solutions, it => { _.reduce(it, (acc, value) => acc + value.provisioned, 0) }) - return _.head(sortedSolutions) + + const cleanSolution = _.filter(_.head(sortedSolutions), it => it.denomination > 0) + + return cleanSolution }