- Активируйте строгий режим соответствия.
- Добавьте код в редактор:
function hslToRgb(h, s, l) {
let r, g, b;
if(s == 0) {
r = g = b = l; // achromatic
} else {
const hue2rgb = function (p, q, t) {
if(t < 0) t += 1;
if(t > 1) t -= 1;
if(t < 1/6) return p + (q - p) * 6 * t;
if(t < 1/2) return q;
if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;
return p;
};
const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
const p = 2 * l - q;
r = hue2rgb(p, q, h + 1/3);
g = hue2rgb(p, q, h);
b = hue2rgb(p, q, h - 1/3);
}
function colorToHex(color) {
let hex = Math.round(color * 255).toString(16);
return hex.length < 2 ? `0${hex}` : hex;
}
const color = [r, g, b].map(colorToHex).join('');
return `#${color}`;
}
class Order {
constructor(id, weight) {
this.id = id;
this.weight = weight;
}
}
class Truck extends Array {
constructor(number, weightLimit) {
super();
this.number = number;
this.weightLimit = weightLimit;
}
add(order) {
if (!this.isFit(order)) {
return false;
}
this.push(order);
return true;
}
isFit(order) {
return this.weightLimit >= (this.totalWeight + order.weight);
}
get totalWeight() {
return this.reduce((total, order) => total + order.weight, 0);
}
show() {
console.log(`Машина №${this.number} (общий вес груза ${this.totalWeight}кг):`);
this.forEach(order => console.log(`\tЗаказ #${order.id} ${order.weight}кг`));
}
}Мы хотим для каждого пользователя выдавать наш сайт в уникальных цветах. И первое, что для этого нужно сделать — это реализовать генератор цветовой палитры с аналогичными цветами.
Для этого вам потребуется реализовать генератор palette, который принимает количество цветов и создает итератор цветов.
Создает итератор сгенерированных цветов. Принимает один аргумент:
amount— количество цветов, которое нужно сгенерировать, число.
Количество итераций равно числу, которое передано в генератор palette. В каждой итерации должен вернуть цвет в шестнадцатеричном представлении формата RGB, например #f8dff2, который обычно применяется в CSS.
Для генерации аналогичных цветов удобнее всего использовать формат HSL. Потому что в нём цвет состоит из тона (hue), насыщенности (saturation) и светлоты (lightness). У аналогичных цветов насыщенность и светлота будут одинаковыми, а тон будет отличаться на равные значения. Тон обычно представляют в виде цветового круга. Тон, равный 0 (0˚), и тон, равный 1(360˚), совпадают.
И, если нам нужно получить 3 цвета, мы можем взять на круге 3 точки через каждые 120˚ (360 / 3): например, 33˚, 153˚ и 273˚, что соответствует тонам 33/360, 153/360 и 273/360. Сгенерировав случайный тон, насыщенность и светлоту и получив нужное количество тонов, останется только перевести полученный цвет в RGB-формат. Для этого воспользуйтесь функцией hslToRgb.
Функция принимает три числа, соответствующие трем компонентам HSL представления цвета: тону, насыщенности и светлоте:
hue— тон, число от0до1;saturation— насыщенность, число от0до1;lightness— светлота, число от0до1.
Функция возвращает строку в формате RGB.
for (const color of palette(3)) {
console.log(color);
}Если все реализовано верно, вы получите три случайных аналогичных цвета:
#817a8d
#8d817a
#7a8d81
- Создайте генератор
palette. - Сгенерируйте случайный тон, насыщенность и светлоту.
- Определите шаг изменения тона, исходя из количества, которое нужно сгенерировать.
- Меняйте тон в цикле на полученный шаг.
- Если значение тона превысило
1, просто уменьшите его на1. - В каждой итерации возвращайте в итератор RGB-цвет для полученных насыщенности, светлоты и текущего тона.
- Количество итераций должно быть равно количеству цветов.
Для нашей новой акции с суперскидками мы хотим реализовать простую игру «угадай число». Наш сайт будет загадывать скидку, и пользователь должен будет её угадать.
Ваша задача — реализовать генератор numberQuiz, который бы смог контролировать процесс игры. В качестве аргумента он принимает загаданное число и выдает подсказки «больше» или «меньше» до тех пор, пока пользователь не угадает это число.
Создает итератор, который контролирует ход игры. Принимает один аргумент:
number— число, которое необходимо угадать, число.
Созданный итератор должен вернуть строку «Назовите число:» и ожидать последующих действий со стороны вызывающего кода.
Вызывающий код должен передавать во все последующие вызовы метода next число, которое называет пользователь. Если число совпало с загаданным, итератор должен завершиться с сообщением «Вы угадали, это 5». Иначе он должен вернуть подсказку «Меньше, чем 7!» или «Больше, чем 4!» и ожидать следующего хода.
В данном примере attempts — числа в том порядке, в котором их будет называть пользователь.
const attempts = [7, 4, 6, 5];
const quiz = numberQuiz(5);
let attempt, result;
do {
result = quiz.next(attempt);
console.log(result.value);
attempt = attempts.shift();
} while (!result.done);Если все реализовано верно, вы получите такой вывод:
Назовите число:
Меньше, чем 7!
Больше, чем 4!
Меньше, чем 6!
Вы угадали, это 5
- Создайте генератор
numberQuiz. - Верните сообщение «Назовите число:» c помощью
yield. - Получите значение из итератора.
- Сравните значение из итератора с тем, что было передано в генератор.
- Если числа совпадают, завершите итератор сообщением «Вы угадали, это 5».
- Если нет, верните с помощью
yieldподсказку. - И так, пока пользователь не угадает число.
Проверьте работу вашего кода на примере использования. Также протестируйте его, используя свои примеры.
Для нашего отдела логиcтики потребовалось реализовать функционал, который бы показывал, какой заказ в какую машину грузить.
Реализовать простой класс TruckPlanner, который бы позволял в простом виде получить распределение заказов по машинам. На данном этапе не требуется решать задачу оптимального распределения заказов с целью сокращения количества машин.
Класс TruckPlanner должен принимать в конструктор следующие аргументы:
weightLimit— лимит по весу для всех машин, число.
У экземпляра класса TruckPlanner должен быть доступен один метод:
add — добавляет заказ в планировщик, принимает в качестве аргумента заказ Order.
У экземпляра класса TruckPlanner должен быть реализован итератор, который возвращает машины Truck с распределенными по ним заказами Order.
Для реализации итератора должен обязательно быть использован генератор. Уточним еще раз, что заказы нужно распределить по машинам просто последовательно, с учетом лимита, оптимизировать распределение не требуется.
Принимает в конструктор два аргумента:
id— идентификатор, число;weight— вес заказа, число.
Принимает в конструктор два аргумента:
number— порядковый номер машины, число;weightLimit— лимит по весу, число.
Имеет следующие свойства и методы:
totalWeight — свойство - общий вес заказов, число, только для чтения.
add — метод - помещает заказ в машину, принимает заказ Order в качестве аргумента. Вернет истину, если заказ влезает в машину, иначе вернет ложь.
isFit — метод - проверит, поместится ли заказ в машину, принимает заказ Order в качестве аргумента. Вернет истину, если заказ влезает в машину, иначе вернет ложь.
const planner = new TruckPlanner(10);
planner.add(new Order(1, 2));
planner.add(new Order(2, 5));
planner.add(new Order(3, 4));
planner.add(new Order(4, 4));
planner.add(new Order(5, 1));
planner.add(new Order(6, 2));
for (const truck of planner) {
truck.show();
}Если все реализовано верно, вы получите такой вывод:
Машина №1 (общий вес груза 7кг):
Заказ #1 2кг
Заказ #2 5кг
Машина №2 (общий вес груза 9кг):
Заказ #3 4кг
Заказ #4 4кг
Заказ #5 1кг
Машина №3 (общий вес груза 2кг):
Заказ #6 2кг
- Создайте класс
TruckPlanner. - Реализуйте конструктор.
- Реализуйте метод
add. - Добавьте символьное свойство
Symbol.iterator, сделав его генератором. - Перебирайте заказы, помещая их в машину
Truck. - Как только заказы перестанут помещаться в машину, верните в итератор текущую машину и создайте новую.
- И так до тех пор, пока заказы не закончатся.
Инструкция по выполнению домашнего задания:
- Зарегистрируйтесь на сайте Repl.IT.
- Перейдите в раздел my repls.
- Нажмите кнопку Start coding now!, если приступаете впервые, или New Repl, если у вас уже есть работы.
- В списке языков выберите JavaScript.
- Код пишите в левой части окна.
- Посмотреть результат выполнения файла можно, нажав на кнопку Run. Результат появится в правой части окна.
- После окончания работы нажмите кнопку Share и скопируйте ссылку из поля Share link.
- В личном кабинете на сайте netology.ru в поле комментария к домашней работе вставьте скопированную ссылку и отправьте работу на проверку.
Никаких файлов прикреплять не нужно.