Guest User

Untitled

a guest
Oct 20th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.08 KB | None | 0 0
  1. const NUM_TRANS_PARTS = 10;
  2. const REIGNS_SUPREME = new Set([
  3. 'Optimus Prime',
  4. 'Predaking',
  5. ]);
  6.  
  7. const TEAMS = new Map([
  8. ['D', 'Decepticons'],
  9. ['A', 'Autobots'],
  10. ]);
  11.  
  12. /////
  13.  
  14. let sampleInput = [
  15. 'Soundwave, D, 8,9,2,6,7,5,6,10',
  16. 'Bluestreak, A, 6,6,7,9,5,2,9,7',
  17. 'Hubcap, A, 4,4,4,4,4,4,4,4',
  18. ];
  19.  
  20. let withOptimus = [
  21. 'Optimus Prime, A, 10,10,8,10,10,10,8,10',
  22. 'Soundwave, D, 8,9,2,6,7,5,6,10',
  23. ]
  24.  
  25. let cataclysmBattle = [
  26. 'Optimus Prime, A, 10,10,8,10,10,10,8,10',
  27. 'Predaking, D, 10, 5, 0, 8,7, 9, 9, 8',
  28. 'Soundwave, D, 8,9,2,6,7,5,6,10',
  29. 'Bluestreak, A, 6,6,7,9,5,2,9,7',
  30. 'Hubcap, A, 4,4,4,4,4,4,4,4',
  31. ];
  32.  
  33. let largeBattle = [
  34. 'Optimus Prime, A, 10,10,8,10,10,10,8,10',
  35. 'Predakung, D, 10, 5, 0, 8,7, 9, 9, 8',
  36. 'Soundwave, D, 8,9,2,6,7,5,6,10',
  37. 'Bluestreak, A, 6,6,7,9,5,2,9,7',
  38. 'Hubcap, A, 4,4,4,4,4,4,4,4',
  39. ]
  40.  
  41. /////
  42. console.log(run(largeBattle));
  43. console.log(run(sampleInput));
  44. console.log(run(cataclysmBattle));
  45.  
  46. /**
  47. * This function is the entry point
  48. * @param {Array} battleInput array of strings describing the contestants
  49. * @return {String} results
  50. */
  51. function run(battleInput) {
  52. let transformers = sortTransformers(makeTransformers(battleInput));
  53. let teams = makeTeams(transformers);
  54. let matchups = createMatchups(teams);
  55.  
  56. let willHaveCataclysm = matchups.reduce(findCataclysm, false);
  57.  
  58. if(willHaveCataclysm) {
  59. return `All transformers destroyed`;
  60. }
  61.  
  62. let results = matchups.map(fight);
  63. let destroyed = results.reduce(findDestroyed, []);
  64. let alive = transformers.filter(stillAlive(destroyed));
  65. let teamResults = getTeamResults(makeTeams(destroyed));
  66. let aliveByTeam = makeTeams(alive);
  67.  
  68. return [
  69. matchups.length == 1 ? '1 battle' : `${matchups.length} battles`,
  70. teamResults ? `Winning team (${TEAMS.get(teamResults.winner)}): ${teams[teamResults.winner].map(getName).join(', ')}` : 'Battle draw',
  71. teamResults
  72. ? `Survivors from the losing team (${TEAMS.get(teamResults.loser)}): ${aliveByTeam[teamResults.loser].map(getName).join(', ')}`
  73. : `Survivors: ${alive.map(getNameTeam).join(', ')}, Deaders: ${destroyed.map(getNameTeam).join(', ')}`,
  74. ].join('\n')
  75. }
  76.  
  77. //// HELPERS
  78.  
  79. function makeTransformers(input) {
  80. return Array.isArray(input)
  81. ? input.map(makeTransformer)
  82. .filter(Boolean)
  83. : [];
  84. }
  85.  
  86. /**
  87. * Creates a transformer object from an input string
  88. * @param {String} input
  89. * @return {Object}
  90. */
  91. function makeTransformer(input) {
  92. let parts = input.split(',')
  93. .filter(Boolean)
  94. .map((part) => part.trim());
  95. if(parts.length !== NUM_TRANS_PARTS) { return; }
  96.  
  97. let [name, team, ...stats] = parts,
  98. [strength, intelligence, speed, endurance, rank, courage, firepower, skill] = stats.map(parseFloat);
  99.  
  100. return {
  101. name, team, strength, intelligence, speed, endurance, rank, courage, firepower, skill,
  102. rating: strength + intelligence + speed + endurance + firepower,
  103. isSupreme: REIGNS_SUPREME.has(name),
  104. };
  105. }
  106.  
  107. function sortTransformers(transformers) {
  108. return transformers.sort((transA, transB) => {
  109. let {rankA} = transA,
  110. {rankB} = transB;
  111.  
  112. return rankA - rankB;
  113. })
  114. }
  115.  
  116. function makeTeams(transformers) {
  117. return transformers.reduce((teams, transformer) => {
  118. teams[transformer.team].push(transformer);
  119. return teams;
  120. }, {A: [], D:[]})
  121. }
  122.  
  123. function createMatchups({D, A}) {
  124. let numDecep = D.length;
  125. let numAuto = A.length;
  126. let largestTeam = numAuto > numDecep ? A : D;
  127. let smallestTeam = numAuto > numDecep ? D : A;
  128.  
  129. return largestTeam.reduce((fights, fighterA, index) => {
  130. let fighterB = smallestTeam[index];
  131.  
  132. if(!fighterB) {
  133. return fights;
  134. };
  135.  
  136. return [...fights, [fighterA, fighterB]];
  137. }, [])
  138. }
  139.  
  140. /**
  141. * The function that actually makes them compete
  142. * @param {Object} [transformerA
  143. * @param {Object} transformerB]
  144. * @return {Object} results from the fight
  145. */
  146. function fight([transformerA, transformerB]) {
  147. let transASupreme = transformerA.isSupreme,
  148. transBSupreme = transformerB.isSupreme;
  149.  
  150. if(transASupreme) { return aWins(); }
  151. if(transBSupreme) { return bWins(); }
  152.  
  153. let courageDiff = transformerA.courage - transformerB.courage;
  154. let strengthDiff = transformerA.strength - transformerB.strength;
  155.  
  156.  
  157. if((courageDiff > 3) && (strengthDiff > 2)) {
  158. return aWins();
  159. }
  160.  
  161. if((courageDiff < -3) && (strengthDiff < -2)) {
  162. return bWins();
  163. }
  164.  
  165. let skillDiff = transformerA.skill - transformerB.skill;
  166.  
  167. if((skillDiff > 2)) {
  168. return aWins();
  169. }
  170.  
  171. if((skillDiff < -2)) {
  172. return bWins();
  173. }
  174.  
  175. let ratingDiff = transformerA.rating - transformerB.rating;
  176.  
  177. if(ratingDiff != 0) {
  178. return ratingDiff > 0
  179. ? aWins()
  180. : bWins();
  181. }
  182.  
  183. return {destroyed: [transformerA, transformerB]};
  184.  
  185. function aWins() {
  186. return {
  187. alive: [transformerA],
  188. destroyed: [transformerB]
  189. };
  190. }
  191.  
  192. function bWins() {
  193. return {
  194. alive: [transformerB],
  195. destroyed: [transformerA]
  196. }
  197. }
  198. }
  199.  
  200. function findDestroyed(memo, {destroyed}) {
  201. return memo.concat(destroyed);
  202. }
  203.  
  204. function stillAlive(destroyed) {
  205. return (transformer) => {
  206. return destroyed.indexOf(transformer) == -1;
  207. }
  208. }
  209.  
  210. /**
  211. * Finds out if Optimus Primer or Predaking are about to fight in a battle
  212. * @param {Boolean} hadCataclysm
  213. * @param {Object} [transformerA
  214. * @param {Object} transformerB]
  215. * @return {Boolean}
  216. */
  217. function findCataclysm(hadCataclysm, [transformerA, transformerB]) {
  218. let transASupreme = transformerA.isSupreme,
  219. transBSupreme = transformerB.isSupreme;
  220.  
  221. return hadCataclysm || (transformerA && transBSupreme);
  222. }
  223.  
  224. /**
  225. * Determines which, if any, team won
  226. * @param {Array} options.D array of destroyed decepticons
  227. * @param {Array} options.A array of destroyed autobots
  228. * @return {Object|undefined}
  229. */
  230. function getTeamResults({D, A}) {
  231. if(D.length === A.length) { return; }
  232. return D.length < A.length
  233. ? {winner: 'D', loser: 'A'}
  234. : {winner: 'A', loser: 'D'};
  235. }
  236.  
  237. function getName({name}) {
  238. return name;
  239. }
  240.  
  241. function getNameTeam({name, team}) {
  242. return `${name}(${team})`;
  243. }
Add Comment
Please, Sign In to add comment