Advertisement
simonradev

RestHouse

Feb 8th, 2018
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function main(allRooms, allPeople) {
  2.     const BedsPerRoomType = {
  3.         ['double-bedded']: 2,
  4.         triple: 3,
  5.     };        
  6.    
  7.     prepareRooms(allRooms, BedsPerRoomType);
  8.  
  9.     let guestsInTeaHouse = fillTheRooms(allRooms, allPeople);
  10.  
  11.     allRooms.sort((a, b) => stringComparison(a, b, r => r.number));
  12.  
  13.     printResult(allRooms, guestsInTeaHouse);
  14.  
  15.     function printResult(allRooms, guestsInTeaHouse) {
  16.         for (const room of allRooms) {
  17.             console.log(`Room number: ${room.number}`);
  18.  
  19.             const allGuests = room.guests.sort((a, b) => stringComparison(a, b, g => g.name));
  20.             for (const guest of allGuests) {
  21.                 console.log(`--Guest Name: ${guest.name}`);
  22.                 console.log(`--Guest Age: ${guest.age}`);
  23.             }
  24.  
  25.             console.log(`Empty beds in the room: ${room.emptyBeds}`);
  26.         }
  27.  
  28.         console.log(`Guests moved to the tea house: ${guestsInTeaHouse}`);
  29.     }
  30.  
  31.     function stringComparison(a, b, getFactorFunc) {
  32.         let result = 0;
  33.  
  34.         if (getFactorFunc(a) > getFactorFunc(b)) {
  35.             result = 1;
  36.         } else if (getFactorFunc(a) < getFactorFunc(b)) {
  37.             result = -1;
  38.         }
  39.  
  40.         return result;
  41.     }
  42.  
  43.     function fillTheRooms(allRooms, allPeople) {
  44.         let guestsInTeaHouse = 0;
  45.  
  46.         for (const {first, second} of allPeople) {
  47.             let peopleForTeaHouse = 0;
  48.             if (!peopleAreOfSameGender(first, second)) { // move in first free room
  49.                 peopleForTeaHouse = moveCoupleInFirstFreeDoubleRoom(allRooms, first, second);
  50.             } else if (peopleAreOfSameGender(first, second)) { // move in a triple room
  51.                 peopleForTeaHouse = movePeopleInTripleRooms(allRooms, first, second);
  52.             }
  53.    
  54.             guestsInTeaHouse += peopleForTeaHouse;
  55.         }
  56.  
  57.         return guestsInTeaHouse;
  58.     }
  59.  
  60.     function moveCoupleInFirstFreeDoubleRoom(allRooms, firstPerson, secondPerson) {
  61.         const freeRoom = findFirstFreeRoomByType(allRooms, 'double-bedded');
  62.  
  63.         if (!freeRoom) {
  64.             return 2;
  65.         }
  66.  
  67.         freeRoom.guests.push(firstPerson, secondPerson);
  68.         freeRoom.emptyBeds = 0;
  69.  
  70.         return 0;
  71.     }
  72.  
  73.     function movePeopleInTripleRooms(allRooms, firstPerson, secondPerson) {
  74.         let people = [firstPerson, secondPerson];
  75.  
  76.         const bonusRule = r => roomHasNoRuleGender(r) || r.ruleGender === firstPerson.gender;
  77.         let freeRoom = findFirstFreeRoomByType(allRooms, 'triple', bonusRule);
  78.         while (people.length &&
  79.                freeRoom) {
  80.             const guestToPlace = people[0];
  81.             people = people.slice(1, people.length);
  82.  
  83.             freeRoom.guests.push(guestToPlace);
  84.             freeRoom.emptyBeds--;
  85.  
  86.             if (roomHasNoRuleGender(freeRoom)) {
  87.                 freeRoom.ruleGender = guestToPlace.gender;
  88.             }
  89.  
  90.             freeRoom = findFirstFreeRoomByType(allRooms, 'triple', bonusRule);
  91.         }
  92.  
  93.         return people.length;
  94.     }
  95.  
  96.     function peopleAreOfSameGender(firstPerson, secondPerson) {
  97.         return firstPerson.gender === secondPerson.gender;
  98.     }
  99.  
  100.     function prepareRooms(allRooms, BedsPerRoomType) {
  101.         for (const room of allRooms) {
  102.             const roomType = room.type;
  103.             const bedsForRoom = BedsPerRoomType[roomType];
  104.    
  105.             room.emptyBeds = bedsForRoom;
  106.             room.guests = [];
  107.    
  108.             if (roomType === 'triple') {
  109.                 room.ruleGender = '';
  110.             }
  111.         }
  112.     }
  113.  
  114.     function findFirstFreeRoomByType(allRooms, type, bonusRule = () => true) {
  115.        return allRooms.find(r => r.type === type && r.emptyBeds !== 0 && bonusRule(r));
  116.     }
  117.  
  118.     function roomHasNoRuleGender(room) {
  119.         return !room.ruleGender;
  120.     }
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement