Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

120 lignes
2.5 KiB

  1. var bodyParser = require('body-parser')
  2. var express = require('express')
  3. var app = express()
  4. var input
  5. app.use(bodyParser.json({
  6. limit: '100mb',
  7. type: 'application/json'
  8. }))
  9. app.get('/help', function (req, res) {
  10. res.send('https://github.com/binhonglee/Breakups')
  11. })
  12. app.post('/total', function (req, res) {
  13. input = req.body
  14. var toReturn = { 'total': 0 }
  15. toReturn.total = total(input.users)
  16. res.json(toReturn)
  17. })
  18. app.post('/perPerson', function (req, res) {
  19. input = req.body
  20. var toReturn = { 'perPerson': 0 }
  21. toReturn.perPerson = (total(input.users)) / input.users.length
  22. res.json(toReturn)
  23. })
  24. app.post('/oweChart', function (req, res) {
  25. input = req.body
  26. input.users = oweChart(input.users)
  27. res.send(input)
  28. })
  29. app.post('/sortedOweChart', function (req, res) {
  30. input = req.body
  31. input.users = mergeSort(oweChart(input.users))
  32. res.send(input)
  33. })
  34. app.post('/paymentChain', function (req, res) {
  35. input = req.body
  36. res.json(paymentChain(mergeSort(oweChart(input.users))))
  37. })
  38. // app.listen(3000)
  39. app.listen(process.env.PORT)
  40. function total (input) {
  41. var total = 0
  42. for (var i = 0; i < input.length; i++) {
  43. total += input[i].amount
  44. }
  45. return total
  46. }
  47. function oweChart (users) {
  48. var perPerson = total(users) / users.length
  49. for (var i = 0; i < users.length; i++) {
  50. users[i].amount -= perPerson
  51. }
  52. return users
  53. }
  54. function mergeSort (users) {
  55. if (users.length < 2) {
  56. return users
  57. }
  58. var middle = Math.floor(users.length / 2)
  59. var left = users.slice(0, middle)
  60. var right = users.slice(middle)
  61. return merge(mergeSort(left), mergeSort(right))
  62. }
  63. function merge (left, right) {
  64. var result = []
  65. var il = 0
  66. var ir = 0
  67. while (il < left.length && ir < right.length) {
  68. if (left[il].amount < 0 && right[ir].amount < 0) {
  69. if (left[il].amount > right[ir].amount) {
  70. result.push(left[il++])
  71. } else {
  72. result.push(right[ir++])
  73. }
  74. } else {
  75. if (left[il].amount < right[ir].amount) {
  76. result.push(left[il++])
  77. } else {
  78. result.push(right[ir++])
  79. }
  80. }
  81. }
  82. return result.concat(left.slice(il)).concat(right.slice(ir))
  83. }
  84. function paymentChain (users) {
  85. var chain = []
  86. var stack = 0
  87. for (var i = 0; i < users.length - 1; i++) {
  88. var item = {'from': '', 'to': '', 'amount': 0}
  89. item['from'] = users[i].name
  90. item['to'] = users[i + 1].name
  91. var amount = users[i].amount * -1
  92. stack += amount
  93. item['amount'] = stack
  94. chain.push(item)
  95. }
  96. return chain
  97. }