fix: edge cases on makeChangeDynamic

This commit is contained in:
Sérgio Salgado 2021-10-15 16:11:47 +01:00
parent eceea49417
commit 03fc35e9d1

View file

@ -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
}