fix: edge cases on makeChangeDynamic
This commit is contained in:
parent
eceea49417
commit
03fc35e9d1
1 changed files with 71 additions and 3 deletions
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue