fix: makeChangeDynamic

This commit is contained in:
Sérgio Salgado 2021-10-15 14:59:16 +01:00
parent 9d3d8fd804
commit eceea49417

View file

@ -48,37 +48,77 @@ function makeChangeDuo (cassettes, amount) {
}
function makeChangeDynamic (cassettes, amount) {
const cassetteMap = _.map(cassettes, it => ({
denomination: it.denomination
}))
while (_.size(cassettes) < 4) {
cassettes.push({ denomination: 0, count: 0 })
}
const solutions = []
const amountNum = amount.toNumber()
const sortedCassettes = _.orderBy(cassetteMap, ['denomination'], ['desc'])
const finalDist = []
let mutableAmount = _.clone(amountNum)
while(mutableAmount >= 0) {
_.each(sortedCassettes, it => {
if (mutableAmount === 0) {
finalDist.push({ provisioned: 0, denomination: it.denomination, id: uuid.v4() })
return
for (let i = 0; i * cassettes[0].denomination <= amountNum; i++) {
for (
let j = 0;
i * cassettes[0].denomination + j * cassettes[1].denomination <=
amountNum;
j++
) {
for (
let k = 0;
i * cassettes[0].denomination +
j * cassettes[1].denomination +
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 amountToSub = mutableAmount - remainder
const numberOfBills = amountToSub / it.denomination
mutableAmount -= amountToSub
finalDist.push({ provisioned: numberOfBills, denomination: it.denomination, id: uuid.v4() })
return
})
if (mutableAmount === 0) {
break
}
}
return finalDist
const sortedSolutions = _.sortBy(solutions, it => {
_.reduce(it, (acc, value) => acc + value.provisioned, 0)
})
return _.head(sortedSolutions)
}