Advertisement
kstoyanov

10. Game Of Epicness

Sep 21st, 2020
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function solve(inputGenerals, battles) {
  2.   const getKingdoms = () => {
  3.     const kingdoms = new Map();
  4.  
  5.     inputGenerals.forEach((line) => {
  6.       let currentKingdom = kingdoms.get(line.kingdom);
  7.       if (!currentKingdom) {
  8.         kingdoms.set(line.kingdom, []);
  9.         currentKingdom = kingdoms.get(line.kingdom);
  10.       }
  11.  
  12.       let currentGeneral = currentKingdom.filter((g) => g.general === line.general)[0];
  13.       if (!currentGeneral) {
  14.         currentGeneral = {
  15.           general: line.general,
  16.           army: line.army,
  17.           kingdom: line.kingdom,
  18.           wins: 0,
  19.           loses: 0,
  20.         };
  21.  
  22.         currentKingdom.push(currentGeneral);
  23.       } else {
  24.         currentGeneral.army += line.army;
  25.       }
  26.     });
  27.  
  28.     return kingdoms;
  29.   };
  30.  
  31.   const kingdoms = getKingdoms();
  32.  
  33.   const getGeneral = (kingdomName, generalName) => {
  34.     const currentKingdom = kingdoms.get(kingdomName);
  35.     if (!currentKingdom) {
  36.       return null;
  37.     }
  38.  
  39.     const general = currentKingdom.filter((g) => g.general === generalName);
  40.     if (general.length === 0) {
  41.       return null;
  42.     }
  43.  
  44.     return general[0];
  45.   };
  46.  
  47.  
  48.   for (let i = 0; i < battles.length; i++) {
  49.     const attacker = getGeneral(battles[i][0], battles[i][1]);
  50.     const defender = getGeneral(battles[i][2], battles[i][3]);
  51.  
  52.     if (attacker === null
  53.       || defender === null
  54.       || attacker.kingdom === defender.kingdom
  55.       || attacker.army === defender.army) {
  56.       continue;
  57.     }
  58.  
  59.     if (attacker.army > defender.army) {
  60.       attacker.wins++;
  61.       attacker.army = Math.floor(attacker.army * 1.10);
  62.       defender.loses++;
  63.       defender.army = Math.floor(defender.army * 0.90);
  64.     } else {
  65.       defender.wins++;
  66.       defender.army = Math.floor(defender.army * 1.10);
  67.       attacker.loses++;
  68.       attacker.army = Math.floor(attacker.army * 0.90);
  69.     }
  70.   }
  71.  
  72.   // printing
  73.   const [winningKingdom, winningGenerals] = [...kingdoms]
  74.     .sort((a, b) => {
  75.       // Kingdom Wins Descending
  76.       const secondWins = b[1].map((g) => g.wins).reduce((g1, g2) => g1 + g2);
  77.       const firstWins = a[1].map((g) => g.wins).reduce((g1, g2) => g1 + g2);
  78.       const winsDiff = secondWins - firstWins;
  79.  
  80.       if (winsDiff !== 0) {
  81.         return winsDiff;
  82.       }
  83.  
  84.       // Kingdom Loses Ascending
  85.       const firstLosses = a[1].map((g) => g.loses).reduce((g1, g2) => g1 + g2);
  86.       const secondLosses = b[1].map((g) => g.loses).reduce((g1, g2) => g1 + g2);
  87.       const lossesDif = firstLosses - secondLosses;
  88.       if (lossesDif !== 0) {
  89.         return lossesDif;
  90.       }
  91.  
  92.       // Kingdom Name Ascending Alphabetical
  93.       return a[0].localeCompare(b[0]);
  94.     })[0];
  95.  
  96.   let result = `Winner: ${winningKingdom}\n`;
  97.   winningGenerals
  98.     .sort((a, b) => b.army - a.army)
  99.     .forEach((el) => {
  100.       result += `/\\general: ${el.general}\n`
  101.           + `---army: ${el.army}\n`
  102.           + `---wins: ${el.wins}\n`
  103.           + `---losses: ${el.loses}\n`;
  104.     });
  105.  
  106.   console.log(result.trim());
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement