Advertisement
kstoyanov

04. Game of Epicness js exam

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