Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.08 KB | None | 0 0
  1. const chefs = [
  2. { name: 'jeff', min: 0, max: 20 },
  3. { name: 'nick', min: 5, max: 35 },
  4. { name: 'alexis', min: 0, max: 20 },
  5. { name: 'bob', min: 10, max: 30 },
  6. { name: 'will', min: 5, max: 65 },
  7. { name: 'alessandra', min: 15, max: 50 },
  8. { name: 'john', min: 0, max: 60 },
  9. { name: 'gideon', min: 5, max: 50 },
  10. { name: 'elaine', min: 15, max: 30 },
  11. { name: 'stefan', min: 0, max: 80 },
  12. { name: 'lloyd', min: 5, max: 35 },
  13. { name: 'theresa', min: 5, max: 35 },
  14. { name: 'ian', min: 0, max: 40 },
  15. { name: 'sarah', min: 0, max: 40 },
  16. { name: 'jason', min: 0, max: 40 },
  17. { name: 'bryan', min: 0, max: 30 },
  18. { name: 'cassie', min: 5, max: 60 },
  19. { name: 'rick', min: 0, max: 30 },
  20. { name: 'jess', min: 5, max: 40 },
  21. { name: 'brandon', min: 0, max: 45 }
  22. ];
  23.  
  24. const addCount = arr => arr.map(obj => Object.assign(obj, { count: 0 } ));
  25.  
  26. const handleError = (type, val) => {
  27. switch (type) {
  28. case 'UNFULFILLED':
  29. return console.log('Insufficient orders were received to fulfill all client minimum requirements.');
  30. case 'INVALID':
  31. return console.log('Invalid argument(s) passed for order count and/or array.');
  32. case 'SURPLUS':
  33. return console.log(`An order sum larger than what could be distributed was received. There are ${val} remaining orders to be filled.`);
  34. }
  35. }
  36.  
  37. const fulfillMin = (arr, orders) => {
  38. let error;
  39. let ordersRemaining = arr.reduce((acc, curr) => {
  40. if (curr.min > 0 && acc > 0) {
  41. curr.count += curr.min;
  42. return acc -= curr.min;
  43. }
  44. return acc;
  45. }, orders);
  46.  
  47. error = !ordersRemaining ? handleError('UNFULFILLED') : null;
  48. return [ arr, ordersRemaining, error ];
  49. }
  50.  
  51. const assignOrders = (arr, ordersRemaining) => {
  52. var fulfilled = {};
  53. let accumulator = arr.reduce((acc, curr) => {
  54. if (curr.count < curr.max && acc - 1 > -1) {
  55. curr.count += 1;
  56. return --acc;
  57. } else if (curr.count === curr.max && !fulfilled[curr.name]) {
  58. fulfilled[curr.name] = true;
  59. return acc;
  60. }
  61. return acc;
  62. }, ordersRemaining);
  63.  
  64. return [ accumulator, (Object.keys(fulfilled).length === arr.length) ];
  65. }
  66.  
  67. const fulfillAll = args => {
  68. let [ arr, accumulator, error ] = args;
  69. if (error) return [ arr, accumulator, error ];
  70.  
  71. let fulfilled = false;
  72.  
  73. while (accumulator !== 0 && !fulfilled) {
  74. [ accumulator, fulfilled ] = assignOrders(arr, accumulator);
  75. }
  76. return accumulator ? [ arr, accumulator, handleError('SURPLUS', accumulator) ] : [ arr, accumulator ];
  77. }
  78.  
  79. const calculateTotalOrdersAssigned = arr => {
  80. let sum = 0;
  81. for (let i = 0; i < arr.length; i++) {
  82. sum += arr[i].count;
  83. }
  84. return sum;
  85. }
  86.  
  87. const delegateOrders = (arr, orders) => {
  88. if (!Array.isArray(arr) || orders < 1) return handleError('INVALID');
  89.  
  90. let [ res, remainder, error ] = fulfillAll(fulfillMin(addCount(arr), orders));
  91.  
  92. return error ? error : calculateTotalOrdersAssigned(res);
  93. }
  94.  
  95. delegateOrders(chefs, 20); // min orders not fulfilled
  96. delegateOrders(chefs, 601); // normal test case
  97. delegateOrders(chefs, 852); // surplus of orders
  98. delegateOrders({}, 315); // invalid array argument
  99. delegateOrders(chefs, -2); // invalid order count
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement