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
|
// 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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue