fix: makeChangeDynamic
This commit is contained in:
parent
9d3d8fd804
commit
eceea49417
1 changed files with 68 additions and 28 deletions
|
|
@ -48,37 +48,77 @@ function makeChangeDuo (cassettes, amount) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function makeChangeDynamic (cassettes, amount) {
|
function makeChangeDynamic (cassettes, amount) {
|
||||||
const cassetteMap = _.map(cassettes, it => ({
|
while (_.size(cassettes) < 4) {
|
||||||
denomination: it.denomination
|
cassettes.push({ denomination: 0, count: 0 })
|
||||||
}))
|
}
|
||||||
|
|
||||||
|
const solutions = []
|
||||||
const amountNum = amount.toNumber()
|
const amountNum = amount.toNumber()
|
||||||
|
for (let i = 0; i * cassettes[0].denomination <= amountNum; i++) {
|
||||||
const sortedCassettes = _.orderBy(cassetteMap, ['denomination'], ['desc'])
|
for (
|
||||||
|
let j = 0;
|
||||||
const finalDist = []
|
i * cassettes[0].denomination + j * cassettes[1].denomination <=
|
||||||
|
amountNum;
|
||||||
let mutableAmount = _.clone(amountNum)
|
j++
|
||||||
|
) {
|
||||||
while(mutableAmount >= 0) {
|
for (
|
||||||
_.each(sortedCassettes, it => {
|
let k = 0;
|
||||||
if (mutableAmount === 0) {
|
i * cassettes[0].denomination +
|
||||||
finalDist.push({ provisioned: 0, denomination: it.denomination, id: uuid.v4() })
|
j * cassettes[1].denomination +
|
||||||
return
|
k * cassettes[2].denomination <=
|
||||||
|
amountNum;
|
||||||
|
k++
|
||||||
|
) {
|
||||||
|
for (
|
||||||
|
let l = 0;
|
||||||
|
i * cassettes[0].denomination +
|
||||||
|
j * cassettes[1].denomination +
|
||||||
|
k * cassettes[2].denomination +
|
||||||
|
l * cassettes[3].denomination <=
|
||||||
|
amountNum;
|
||||||
|
l++
|
||||||
|
) {
|
||||||
|
if (
|
||||||
|
i * cassettes[0].denomination +
|
||||||
|
j * cassettes[1].denomination +
|
||||||
|
k * cassettes[2].denomination +
|
||||||
|
l * cassettes[3].denomination ===
|
||||||
|
amountNum &&
|
||||||
|
i <= cassettes[0].count &&
|
||||||
|
j <= cassettes[1].count &&
|
||||||
|
k <= cassettes[2].count &&
|
||||||
|
l <= cassettes[3].count && i > 0 && j > 0 && k > 0 && l > 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: l,
|
||||||
|
denomination: cassettes[3].denomination,
|
||||||
|
id: uuid.v4()
|
||||||
|
}
|
||||||
|
])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const remainder = mutableAmount % it.denomination
|
const sortedSolutions = _.sortBy(solutions, it => {
|
||||||
const amountToSub = mutableAmount - remainder
|
_.reduce(it, (acc, value) => acc + value.provisioned, 0)
|
||||||
const numberOfBills = amountToSub / it.denomination
|
|
||||||
mutableAmount -= amountToSub
|
|
||||||
|
|
||||||
finalDist.push({ provisioned: numberOfBills, denomination: it.denomination, id: uuid.v4() })
|
|
||||||
return
|
|
||||||
})
|
})
|
||||||
|
return _.head(sortedSolutions)
|
||||||
if (mutableAmount === 0) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return finalDist
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue