From cb5b517a5a3d7aa2aff68c7e509de65c30e316bc Mon Sep 17 00:00:00 2001 From: BinHong Lee Date: Sat, 21 Oct 2017 00:52:34 -0500 Subject: [PATCH] Payment chain now works as intended --- index.js | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 80 insertions(+), 5 deletions(-) diff --git a/index.js b/index.js index aeb66a6..72ffac5 100644 --- a/index.js +++ b/index.js @@ -8,29 +8,42 @@ app.use(bodyParser.json({ limit: '100mb', type: 'application/json' })) + app.get('/help', function (req, res) { res.send('https://github.com/binhonglee/Breakups') }) + app.post('/total', function (req, res) { input = req.body var toReturn = { 'total': 0 } toReturn.total = total(input.users) res.json(toReturn) }) + app.post('/perPerson', function (req, res) { input = req.body var toReturn = { 'perPerson': 0 } toReturn.perPerson = (total(input.users)) / input.users.length res.json(toReturn) }) + app.post('/oweChart', function (req, res) { input = req.body - var perPerson = total(input.users) / input.users.length - for (var i = 0; i < input.users.length; i++) { - input.users[i].amount -= perPerson - } - res.json(input) + input.users = oweChart(input.users) + res.send(input) +}) + +app.post('/sortedOweChart', function (req, res) { + input = req.body + input.users = mergeSort(oweChart(input.users)) + res.send(input) }) + +app.post('/paymentChain', function (req, res) { + input = req.body + res.json(paymentChain(mergeSort(oweChart(input.users)))) +}) + // app.listen(3000) app.listen(process.env.PORT) @@ -42,3 +55,65 @@ function total (input) { return total } + +function oweChart (users) { + var perPerson = total(users) / users.length + for (var i = 0; i < users.length; i++) { + users[i].amount -= perPerson + } + + return users +} + +function mergeSort (users) { + if (users.length < 2) { + return users + } + + var middle = Math.floor(users.length / 2) + var left = users.slice(0, middle) + var right = users.slice(middle) + + return merge(mergeSort(left), mergeSort(right)) +} + +function merge (left, right) { + var result = [] + var il = 0 + var ir = 0 + + while (il < left.length && ir < right.length) { + if (left[il].amount < 0 && right[ir].amount < 0) { + if (left[il].amount > right[ir].amount) { + result.push(left[il++]) + } else { + result.push(right[ir++]) + } + } else { + if (left[il].amount < right[ir].amount) { + result.push(left[il++]) + } else { + result.push(right[ir++]) + } + } + } + + return result.concat(left.slice(il)).concat(right.slice(ir)) +} + +function paymentChain (users) { + var chain = [] + var stack = 0 + + for (var i = 0; i < users.length - 1; i++) { + var item = {'from': '', 'to': '', 'amount': 0} + item['from'] = users[i].name + item['to'] = users[i + 1].name + var amount = users[i].amount * -1 + stack += amount + item['amount'] = stack + chain.push(item) + } + + return chain +}