Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 'use strict';
- function main(arr) {
- let plantCount = Number(arr[0]);
- const plantContainer = {};
- //Create class
- class Plant {
- constructor(rarity) {
- this.rarity = rarity;
- this.ratings = [];
- this.average = 0;
- }
- Rate = rate;
- Update = update;
- Reset = reset;
- averageRating = averageRating;
- }
- for (let i = 1, l = plantCount + 1; i < l; i++) {
- let [plant, rarity] = arr[i].split('<->');
- rarity = Number(rarity);
- //If plant is already present, update its' rarity
- if (plantContainer.hasOwnProperty(plant)) {
- plantContainer[plant].rarity = rarity;
- } else {
- //Create a new plant
- plantContainer[plant] = new Plant(rarity);
- }
- }
- //Get indices of commands
- let startIndex = plantCount + 1;
- let endIndex = arr.indexOf('Exhibition');
- //Slice just the commands
- let commandArr = arr.slice(startIndex, endIndex);
- //Loop through commands
- commandArr.forEach((line) => {
- let [command, ...rest] = line.split(': ');
- let args = rest.shift().split(' - ');
- let plant = args.shift();
- //Execute command
- if (plantContainer[plant]) {
- plantContainer[plant][command](args);
- } else {
- console.log('error');
- }
- });
- //Set averages
- Object.keys(plantContainer).forEach((key) => {
- plantContainer[key].averageRating();
- });
- //Sort
- let sortedKeys = Object.keys(plantContainer).sort((plantA, plantB) => {
- //Rarities
- let rarityPlantA = plantContainer[plantA].rarity;
- let rarityPlantB = plantContainer[plantB].rarity;
- if (rarityPlantA === rarityPlantB) {
- //Average ratings
- let avgPlantA = plantContainer[plantA].average;
- let avgPlantB = plantContainer[plantB].average;
- return avgPlantB - avgPlantA;
- } else {
- return rarityPlantB - rarityPlantA;
- }
- });
- //Output
- const output = [];
- sortedKeys.forEach((plant) => {
- let rarity = plantContainer[plant].rarity;
- let average = plantContainer[plant].average;
- output.push(`- ${plant}; Rarity: ${rarity}; Rating: ${average.toFixed(2)}`);
- });
- console.log('Plants for the exhibition:');
- console.log(output.join('\n'));
- //Declarations
- function rate(params) {
- let [rating] = params.map(Number);
- //Add the given rating
- //Store all ratings
- this.ratings.push(rating);
- }
- function update(params) {
- let [rarity] = params.map(Number);
- //Update the rarity with the new one
- this.rarity = rarity;
- }
- function reset(params) {
- //Remove all ratings
- this.ratings = [];
- }
- function averageRating() {
- if (this.ratings.length === 0) {
- this.average = 0;
- return;
- }
- let summed = this.ratings.reduce((acc, cur) => {
- return acc + cur;
- }, 0);
- this.average = summed / this.ratings.length;
- }
- }
- let result = main([
- '3',
- 'Arnoldii<->4',
- 'Woodii<->7',
- 'Welwitschia<->2',
- 'Rate: Woodii - 10',
- 'Rate: Welwitschia - 7',
- 'Rate: Arnoldii - 3',
- 'Rate: Woodii - 5',
- 'Update: Woodii - 5',
- 'Reset: Arnoldii',
- 'Exhibition',
- ]);
- console.log(result);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement