Перед выполнением задания внимательно прочитайте:
- О всех этапах проверки задания
- Как отправить пулл
- Как пройти тесты
- Правила оформления javascript, HTML и CSS кода
Мы очень хотим, чтобы код вы написали сами, а не пользовались внешними библиотеками.
Картофельная вечеринка прошла очень удачно для Билли, он познакомился с девушкой, и спустя какое-то время его корабль, под названием «Любовь», наконец-то готов отправиться в бухту, под названием «Семья». Настало время организовать свадьбу для него.
Билли вновь достаёт свой бумажной блокнотик с записями о друзьях. Кстати, он немного обновил его после картофельной вечеринки – добавил информацию о том, кто и с кем дружит (friends), и кто является его лучшими друзьями (best):
var friends = [ { name: 'Sam', friends: ['Mat', 'Sharon'], gender: 'male', best: true }, { name: 'Sally', friends: ['Brad', 'Emily'], gender: 'female', best: true } ];
Билли хочет, чтобы обязательно был соблюдён ряд условий:
- Во-первых, на свадьбе должны быть не только друзья, но и друзья друзей
- Во-вторых, слишком незнакомые парни смущают Билли и он планирует ограничить уровень неизвестности определённым кругом
- В-третьих, чтобы никому не было грустно – он их собирает в пары «парень + девушка»
Для того, чтобы это реализовать понадобятся фильтры и итераторы:
// Создаем фильтры парней и девушек var maleFilter = new lib.MaleFilter(); var femaleFilter = new lib.FemaleFilter(); // Создаем итераторы var femaleIterator = new lib.Iterator(friends, femaleFilter); // Среди парней приглашаем только луших друзей и друзей лучших друзей var maleIterator = new lib.LimitedIterator(friends, maleFilter, 2); var invitedFriends = []; // Собираем пары «парень + девушка» while (!maleIterator.done() && !femaleIterator.done()) { invitedFriends.push([ maleIterator.next(), femaleIterator.next() ]); } // Если остались девушки, то приглашаем остальных while (!femaleIterator.done()) { invitedFriends.push(femaleIterator.next()); }
Примеры использования можно посмотреть в index.js и в тестах.
- Лучшие друзья помечены флагом
best - Для каждого друга указан список его друзей
- Дружба всегда взаимная
- Обход должен происходить, начиная с лучших друзей
- Обход всегда идет в алфавитном порядке имен
- Друзья не должны обходиться дважды
- Первый круг друзей – это лучшие друзья
- Второй круг друзей – это друзья лучших друзей
- Третий круг и остальные строятся аналогичным образом
- Гарантируется, что на входе будут корректные условия
- Неориентированный граф друзей
- Все перечисленные друзья в свойствах
friendsбудут существовать во входном массиве
- Граф друзей может быть несвязным и/или цикличным
- Создает объект итератора, с помощью которого можно обойти друзей по заданным правилам
- На вход он принимает массив и объект фильтра для фильтрации некоторых друзей
- Если объект фильтра не является инстансом функции-конструктора
Filter, должна выброситься ошибкаTypeError - Итератор должен иметь два метода:
done()иnext() - Метод
done()возвращаетtrue, если обход закончен, иfalseв противном случае - Метод
next()возвращает объект друга иnull, если обход закончен
- Наследник
Iterator - Имеет ограничение по кругу (
maxLevel). Если передан 1, то такой итератор обойдет только первый круг друзей. Если передано 2, то обойдет первый и второй. И так далее.
- Создает фильтр, который решает какой друг подходит для итерации
- По умолчанию такой фильтр никого не отсеивает
- Наследник
Filter - Позволяет итерироваться по друзьям мужского пола
- Наследник
Filter - Позволяет итерироваться по друзьям женского пола
Примеры использования можно посмотреть в index.js и в тестах.