Advertisement
kstoyanov

12. Game Of Epicness

Sep 25th, 2020
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function gameOfEpicness(arrayOfKingdoms, fightingKingdoms) {
  2.   const kingdoms = {};
  3.  
  4.   arrayOfKingdoms.forEach((element) => {
  5.     const kingdomName = element.kingdom;
  6.     const generalName = element.general;
  7.     const army = +element.army;
  8.  
  9.     if (!Object.prototype.hasOwnProperty.call(kingdoms, kingdomName)) {
  10.       kingdoms[kingdomName] = {
  11.         [generalName]: { army, wins: 0, losses: 0 },
  12.       };
  13.     } else if (kingdoms[kingdomName].hasOwnProperty([generalName])) {
  14.       kingdoms[kingdomName][generalName].army += army;
  15.     } else {
  16.       kingdoms[kingdomName][generalName] = {
  17.         army,
  18.         wins: 0,
  19.         losses: 0,
  20.       };
  21.     }
  22.   });
  23.  
  24.   for (const element of fightingKingdoms) {
  25.     const [attackKingdom, attackGeneral, deffendKingdom, deffendGeneral] = element;
  26.  
  27.     let armyAttack = 0;
  28.     let armyDeffend = 0;
  29.  
  30.     if (
  31.       kingdoms.hasOwnProperty(attackKingdom)
  32.           && kingdoms.hasOwnProperty(deffendKingdom)
  33.     ) {
  34.       if (kingdoms[attackKingdom] === kingdoms[deffendKingdom]) {
  35.         continue;
  36.       }
  37.       if (
  38.         kingdoms[attackKingdom].hasOwnProperty(attackGeneral)
  39.               && kingdoms[deffendKingdom].hasOwnProperty(deffendGeneral)
  40.       ) {
  41.         armyAttack = kingdoms[attackKingdom][attackGeneral].army;
  42.         armyDeffend = kingdoms[deffendKingdom][deffendGeneral].army;
  43.       }
  44.     }
  45.  
  46.     if (armyAttack > armyDeffend) {
  47.       kingdoms[attackKingdom][attackGeneral].army = Math.floor(
  48.         armyAttack + armyAttack * 0.1,
  49.       );
  50.       kingdoms[attackKingdom][attackGeneral].wins += 1;
  51.       kingdoms[deffendKingdom][deffendGeneral].army = Math.floor(
  52.         armyDeffend - armyDeffend * 0.1,
  53.       );
  54.       kingdoms[deffendKingdom][deffendGeneral].losses += 1;
  55.     } else if (armyAttack < armyDeffend) {
  56.       kingdoms[deffendKingdom][deffendGeneral].army = Math.floor(
  57.         armyDeffend + armyDeffend * 0.1,
  58.       );
  59.       kingdoms[deffendKingdom][deffendGeneral].wins += 1;
  60.       kingdoms[attackKingdom][attackGeneral].army = Math.floor(
  61.         armyAttack - armyAttack * 0.1,
  62.       );
  63.       kingdoms[attackKingdom][attackGeneral].losses += 1;
  64.     }
  65.   }
  66.  
  67.   const getTotal = (kingdom, type) => Object.keys(kingdom).reduce((acc, cur) => (acc + kingdom[cur][type]), 0);
  68.  
  69.   const orderedKingdoms = Object.keys(kingdoms).sort(
  70.     (a, b) => getTotal(kingdoms[b], 'wins') - getTotal(kingdoms[a], 'wins')
  71.           || getTotal(kingdoms[a], 'losses') - getTotal(kingdoms[b], 'losses')
  72.           || a.localeCompare(b),
  73.   );
  74.   const winner = orderedKingdoms[0];
  75.   console.log(`Winner: ${winner}`);
  76.   const generals = Object.keys(kingdoms[winner]).sort(
  77.     (a, b) => kingdoms[winner][b].army - kingdoms[winner][a].army,
  78.   );
  79.   generals.forEach((general) => {
  80.     const info = kingdoms[winner][general];
  81.     console.log(`/\\general: ${general}`);
  82.     console.log(`---army: ${info.army}`);
  83.     console.log(`---wins: ${info.wins}`);
  84.     console.log(`---losses: ${info.losses}`);
  85.   });
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement