Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function main(allRooms, allPeople) {
- const BedsPerRoomType = {
- ['double-bedded']: 2,
- triple: 3,
- };
- prepareRooms(allRooms, BedsPerRoomType);
- let guestsInTeaHouse = fillTheRooms(allRooms, allPeople);
- allRooms.sort((a, b) => stringComparison(a, b, r => r.number));
- printResult(allRooms, guestsInTeaHouse);
- function printResult(allRooms, guestsInTeaHouse) {
- for (const room of allRooms) {
- console.log(`Room number: ${room.number}`);
- const allGuests = room.guests.sort((a, b) => stringComparison(a, b, g => g.name));
- for (const guest of allGuests) {
- console.log(`--Guest Name: ${guest.name}`);
- console.log(`--Guest Age: ${guest.age}`);
- }
- console.log(`Empty beds in the room: ${room.emptyBeds}`);
- }
- console.log(`Guests moved to the tea house: ${guestsInTeaHouse}`);
- }
- function stringComparison(a, b, getFactorFunc) {
- let result = 0;
- if (getFactorFunc(a) > getFactorFunc(b)) {
- result = 1;
- } else if (getFactorFunc(a) < getFactorFunc(b)) {
- result = -1;
- }
- return result;
- }
- function fillTheRooms(allRooms, allPeople) {
- let guestsInTeaHouse = 0;
- for (const {first, second} of allPeople) {
- let peopleForTeaHouse = 0;
- if (!peopleAreOfSameGender(first, second)) { // move in first free room
- peopleForTeaHouse = moveCoupleInFirstFreeDoubleRoom(allRooms, first, second);
- } else if (peopleAreOfSameGender(first, second)) { // move in a triple room
- peopleForTeaHouse = movePeopleInTripleRooms(allRooms, first, second);
- }
- guestsInTeaHouse += peopleForTeaHouse;
- }
- return guestsInTeaHouse;
- }
- function moveCoupleInFirstFreeDoubleRoom(allRooms, firstPerson, secondPerson) {
- const freeRoom = findFirstFreeRoomByType(allRooms, 'double-bedded');
- if (!freeRoom) {
- return 2;
- }
- freeRoom.guests.push(firstPerson, secondPerson);
- freeRoom.emptyBeds = 0;
- return 0;
- }
- function movePeopleInTripleRooms(allRooms, firstPerson, secondPerson) {
- let people = [firstPerson, secondPerson];
- const bonusRule = r => roomHasNoRuleGender(r) || r.ruleGender === firstPerson.gender;
- let freeRoom = findFirstFreeRoomByType(allRooms, 'triple', bonusRule);
- while (people.length &&
- freeRoom) {
- const guestToPlace = people[0];
- people = people.slice(1, people.length);
- freeRoom.guests.push(guestToPlace);
- freeRoom.emptyBeds--;
- if (roomHasNoRuleGender(freeRoom)) {
- freeRoom.ruleGender = guestToPlace.gender;
- }
- freeRoom = findFirstFreeRoomByType(allRooms, 'triple', bonusRule);
- }
- return people.length;
- }
- function peopleAreOfSameGender(firstPerson, secondPerson) {
- return firstPerson.gender === secondPerson.gender;
- }
- function prepareRooms(allRooms, BedsPerRoomType) {
- for (const room of allRooms) {
- const roomType = room.type;
- const bedsForRoom = BedsPerRoomType[roomType];
- room.emptyBeds = bedsForRoom;
- room.guests = [];
- if (roomType === 'triple') {
- room.ruleGender = '';
- }
- }
- }
- function findFirstFreeRoomByType(allRooms, type, bonusRule = () => true) {
- return allRooms.find(r => r.type === type && r.emptyBeds !== 0 && bonusRule(r));
- }
- function roomHasNoRuleGender(room) {
- return !room.ruleGender;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement