Установите зависимости проекта:
npm install
После этого вам будут доступны следующие команды:
npm run lint
- проверка качества вашего кода утилитой ESLintnpm run test [test-file]
- запустить unit-тесты из указанного файла в консоли, например:npm run test test/spec/task-1.spec.js
npm run test
- запуск всех unit-тестов в консолиnpm run test:watch [test-file]
,npm run test:watch
- запуск одного или всех unit-тестов в консоли, с автоматическим перезапуском при изменении исходного кода. Например:npm run test:watch test/spec/task-1.spec.js
Помните, каждый раз когда ваши тесты выполняются корректно, один котик становится радостным! А когда еще и линтовка выполняется без ошибок - то один котик и вовсе находит любящую семью! (к сожалению, у ESLint нет такого репортера)
Внимание!
В решениях всех задач нельзя использовать циклы for
и while
.
Также нельзя использовать метод массивов forEach
, потому что концептуально он почти ничем не отличается от обычных циклов.
Вместо этого используйте методы массивов map
, filter
, reduce
, sort
, every
, some
Напишите функцию sum
, которая суммирует все переданные в нее аргументы.
Число аргументов функции может быть произвольным.
Пример:
sum(1, 2, 3, 4) === 10
sum(5, -5) === 0
Напишите функцию, которая принимает аргумент n
и возвращает функцию-счётчик.
Функция счётчик при первом вызове должна возвращать 0.
При каждом следующем вызове должна возвращать число на n
больше чем предыдущего.
Функции-счётчики должны быть независимыми друг от друга.
Пример:
const tripleCounter = createCounter(3),
evenCounter = createCounter(2);
tripleCounter() === 0;
tripleCounter() === 3;
tripleCounter() === 6;
tripleCounter() === 9;
evenCounter() === 0;
evenCounter() === 2;
evenCounter() === 4;
evenCounter() === 6;
tripleCounter() === 12;
evenCounter() === 8;
evenCounter() === 10;
Дан массив координат. Напишите функцию, которая вычисляет минимальный ограничивающий прямоугольник. То есть такой прямоугольник, в который попадают все точки, и стороны прямоугольника параллельны осям. Если передан пустой массив координат, верните нули для всех полей результата.
Входные данные: Массив пар координат
[
{ x: 49.2382, y: 28.4529 },
{ x: 49.2433, y: 28.4641 },
{ x: 49.2337, y: 28.4715 },
{ x: 49.2365, y: 28.4637 }
]
Выходные данные: Объект вида
{
top: 28.4715,
bottom: 28.4529,
left: 49.2337,
right: 49.2433
}
Настало время писать серьёзные программы: в ваших руках судьба экспедиции на Марс. Для управления роботом с Земли поступают команды вида "go 2", "turn left", "go 1", "turn right", "go 3". Но из-за проблем со связью команды могут прийти в неправильном порядке. Благо у каждой команды есть её порядковый номер, по которому можно восстановить правильную последовательность команд.
Также могут приходить команды, неизвестные марсоходу. Причина этой проблемы выясняется, но в качестве наказания у команды разработки уже отобрали их любимую кофемашину. Пока что если марсоход встречает неизвестную команду, он должен её проигнорировать.
В начале пути марсоход находится в точке { x: 0, y: 0 }
и направлен на север (вверх).
Имея полученные с Земли данные, определите конечные координаты, куда попадёт марсоход после выполнения всех команд.
Возможные команды:
Команда | Данные | Описание |
---|---|---|
go |
целое число | Ехать прямо на указанное количество метров |
turn |
left |
Повернуть налево |
turn |
right |
Повернуть направо |
Входные данные: Массив объектов:
[
{
order: 3, // Третья команда
command: "go 1" // Ехать прямо на 1 метр
}, {
order: 4, // Четвёртая команда
command: "turn right" // Повернуть направо
}, {
order: 7, // Пятая команда
command: "Shake that X-Ray Instrument of yours!" // Непонятно что. Игнорировать
}, {
order: 1, // Первая команда
command: "go 2" // Ехать прямо 2 метра
}, {
order: 6, // Шестая команда
command: "go 3" // Ехать вперёд на 3 метра
}, {
order: 5, // Пятая команда
command: "make a selfie" // Непонятно что. Игнорировать
}, {
order: 2, // Вторая команда
command: "turn left" // Повернуть налево
}
]
Выходные данные: объект из конечных координат x
, y
марсохода
{ x: -1, y: 5 }
Теперь объединим предыдущие задачи.
5.1 Напишите вспомогательную функцию getExpeditionsTargets
, которая принимает масиив из нескольких серий серий команд марсохода.
Каждая из серий команд починяется в точности тех же правилам, что и в задаче 4, и для каждой серии команд движение марсохода начинается в точке 0, 0
,
как и в предыдущей задаче.
Эта функция должна вернуть массив конечных координат марсохода для каждой из серий передвижений.
Пример выходных данных:
[
{ x: 1, y: 5 },
{ x: -13, y: 6 },
{ x: 0, y: -1 }
]
5.2 Напишите функцию boundingRover
, которая принимает несколько серий передвижений марсохода, и возвращает минимальный ограничивающий прямоугольник
для конечных точек, в которых окажется марсоход в результате выполнения каждой из серий команд.
Ответ нужно предоставить в том же формате, что и в задаче 3:
{
top: 6,
bottom: -1,
left: -13,
right: 1
}
Импортируйте и используйте в решении уже готовые решения из задач 3 и 4.
DON'T PANIC!1 Условие задачи выглядит в десяток раз более сложным, чем окажется решение!
Напишите функцию, принимающую к качестве аргумента объект с данными, и возвращающую путь,
по которому в этом объекте находится поле со значением 15
.
Путь - это строка, в которую входят все имена полей начиная от самого верхнего уровня,
разделенные точкой.
Значениями свойств объекта могут быть как простые значения, так и другие объекты и массивы.
Если значение найти не удалось, вернуть null
.
В объекте всегда не больше одного значения 15
.
Для проверки является ли значение объектом или массивом вы можете использовать проверку
if (typeof obj[key] === "object")
. В реальной жизни нужно использовать более сложные проверки,
но для нашего случая подойдет упрощенный вариант.
Также в этом примере вы можете использовать цикл for .. in
для перебора свойств объекта.
Пример:
let obj = {
field1: "hello, world",
name: "Johnny",
t: 99,
almostthere: "15",
subobj: {
name: 13,
arr: [
{ g: -4, k: 1 },
{ test: NaN, x: 15 }
]
},
test: "g"
}
findPath(obj) === "subobj.arr.1.x"
Напишите функцию с переменным числом аргументов, которая возвращает строку с многочленом, в качестве коэффициентов которого выступают аргументы функции. Нулевых слагаемых не должно быть в полиноме. Если коэффициент равен 1 или -1, то слагаемое должно иметь вид "+x^n" или "-x^n".
Например: getPolynomial(-2, 3)
должен вернуть многочлен первой степени "-2*x+3"
.
А getPolynomial(1, 0, 0)
должен сформировать многочлен с единственным слагаемым "x^2"
;
getPolynomial() === "0";
getPolynomial(-2, 3) === "-2*x+3";
getPolynomial(1, 0, 0) === "x^2";
getPolynomial(8, 3.5, -1, 0, 12) === "8*x^4+3.5*x^3-x^2+12";