Advertisement
Btwonu

Charshav

Aug 9th, 2020
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.14 KB | None | 0 0
  1. 'use strict';
  2.  
  3. function main(arr) {
  4. let plantCount = Number(arr[0]);
  5. const plantContainer = {};
  6.  
  7. //Create class
  8. class Plant {
  9. constructor(rarity) {
  10. this.rarity = rarity;
  11. this.ratings = [];
  12. this.average = 0;
  13. }
  14.  
  15. Rate = rate;
  16. Update = update;
  17. Reset = reset;
  18. averageRating = averageRating;
  19. }
  20.  
  21. for (let i = 1, l = plantCount + 1; i < l; i++) {
  22. let [plant, rarity] = arr[i].split('<->');
  23. rarity = Number(rarity);
  24.  
  25. //If plant is already present, update its' rarity
  26. if (plantContainer.hasOwnProperty(plant)) {
  27. plantContainer[plant].rarity = rarity;
  28. } else {
  29. //Create a new plant
  30. plantContainer[plant] = new Plant(rarity);
  31. }
  32. }
  33.  
  34. //Get indices of commands
  35. let startIndex = plantCount + 1;
  36. let endIndex = arr.indexOf('Exhibition');
  37.  
  38. //Slice just the commands
  39. let commandArr = arr.slice(startIndex, endIndex);
  40.  
  41. //Loop through commands
  42. commandArr.forEach((line) => {
  43. let [command, ...rest] = line.split(': ');
  44. let args = rest.shift().split(' - ');
  45. let plant = args.shift();
  46.  
  47. //Execute command
  48. if (plantContainer[plant]) {
  49. plantContainer[plant][command](args);
  50. } else {
  51. console.log('error');
  52. }
  53. });
  54.  
  55. //Set averages
  56. Object.keys(plantContainer).forEach((key) => {
  57. plantContainer[key].averageRating();
  58. });
  59.  
  60. //Sort
  61. let sortedKeys = Object.keys(plantContainer).sort((plantA, plantB) => {
  62. //Rarities
  63. let rarityPlantA = plantContainer[plantA].rarity;
  64. let rarityPlantB = plantContainer[plantB].rarity;
  65.  
  66. if (rarityPlantA === rarityPlantB) {
  67. //Average ratings
  68. let avgPlantA = plantContainer[plantA].average;
  69. let avgPlantB = plantContainer[plantB].average;
  70.  
  71. return avgPlantB - avgPlantA;
  72. } else {
  73. return rarityPlantB - rarityPlantA;
  74. }
  75. });
  76.  
  77. //Output
  78. const output = [];
  79.  
  80. sortedKeys.forEach((plant) => {
  81. let rarity = plantContainer[plant].rarity;
  82. let average = plantContainer[plant].average;
  83.  
  84. output.push(`- ${plant}; Rarity: ${rarity}; Rating: ${average.toFixed(2)}`);
  85. });
  86.  
  87. console.log('Plants for the exhibition:');
  88. console.log(output.join('\n'));
  89.  
  90. //Declarations
  91. function rate(params) {
  92. let [rating] = params.map(Number);
  93.  
  94. //Add the given rating
  95. //Store all ratings
  96. this.ratings.push(rating);
  97. }
  98.  
  99. function update(params) {
  100. let [rarity] = params.map(Number);
  101.  
  102. //Update the rarity with the new one
  103. this.rarity = rarity;
  104. }
  105.  
  106. function reset(params) {
  107. //Remove all ratings
  108. this.ratings = [];
  109. }
  110.  
  111. function averageRating() {
  112. if (this.ratings.length === 0) {
  113. this.average = 0;
  114. return;
  115. }
  116.  
  117. let summed = this.ratings.reduce((acc, cur) => {
  118. return acc + cur;
  119. }, 0);
  120.  
  121. this.average = summed / this.ratings.length;
  122. }
  123. }
  124.  
  125. let result = main([
  126. '3',
  127. 'Arnoldii<->4',
  128. 'Woodii<->7',
  129. 'Welwitschia<->2',
  130. 'Rate: Woodii - 10',
  131. 'Rate: Welwitschia - 7',
  132. 'Rate: Arnoldii - 3',
  133. 'Rate: Woodii - 5',
  134. 'Update: Woodii - 5',
  135. 'Reset: Arnoldii',
  136. 'Exhibition',
  137. ]);
  138. console.log(result);
  139.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement