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 // 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 // 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) { function makeChangeDuo (cassettes, amount) {
@ -61,6 +61,37 @@ function makeChangeDynamic (cassettes, amount) {
amountNum; amountNum;
j++ 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 ( for (
let k = 0; let k = 0;
i * cassettes[0].denomination + i * cassettes[0].denomination +
@ -69,6 +100,39 @@ function makeChangeDynamic (cassettes, amount) {
amountNum; amountNum;
k++ 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 ( for (
let l = 0; let l = 0;
i * cassettes[0].denomination + i * cassettes[0].denomination +
@ -78,6 +142,7 @@ function makeChangeDynamic (cassettes, amount) {
amountNum; amountNum;
l++ l++
) { ) {
if (cassettes[3].denomination === 0) break
if ( if (
i * cassettes[0].denomination + i * cassettes[0].denomination +
j * cassettes[1].denomination + j * cassettes[1].denomination +
@ -87,7 +152,7 @@ function makeChangeDynamic (cassettes, amount) {
i <= cassettes[0].count && i <= cassettes[0].count &&
j <= cassettes[1].count && j <= cassettes[1].count &&
k <= cassettes[2].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([ solutions.push([
{ {
@ -120,5 +185,8 @@ function makeChangeDynamic (cassettes, amount) {
const sortedSolutions = _.sortBy(solutions, it => { const sortedSolutions = _.sortBy(solutions, it => {
_.reduce(it, (acc, value) => acc + value.provisioned, 0) _.reduce(it, (acc, value) => acc + value.provisioned, 0)
}) })
return _.head(sortedSolutions)
const cleanSolution = _.filter(_.head(sortedSolutions), it => it.denomination > 0)
return cleanSolution
} }