dshovchko / practice-2

Practice 2

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Практическая работа 2: функции, замыкания и функциональное программирование

Начало работы

Установите зависимости проекта:

npm install

После этого вам будут доступны следующие команды:

  • npm run lint - проверка качества вашего кода утилитой ESLint
  • npm 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

Задача 1

Напишите функцию sum, которая суммирует все переданные в нее аргументы. Число аргументов функции может быть произвольным.

Пример:

sum(1, 2, 3, 4) === 10
sum(5, -5) === 0

Задача 2

Напишите функцию, которая принимает аргумент 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;

Задача 3

Дан массив координат. Напишите функцию, которая вычисляет минимальный ограничивающий прямоугольник. То есть такой прямоугольник, в который попадают все точки, и стороны прямоугольника параллельны осям. Если передан пустой массив координат, верните нули для всех полей результата.

Входные данные: Массив пар координат

[
    { 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
}

Задача 4

Настало время писать серьёзные программы: в ваших руках судьба экспедиции на Марс. Для управления роботом с Земли поступают команды вида "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

Теперь объединим предыдущие задачи.

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 Условие задачи выглядит в десяток раз более сложным, чем окажется решение!

Задача 6

Напишите функцию, принимающую к качестве аргумента объект с данными, и возвращающую путь, по которому в этом объекте находится поле со значением 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"

Задача 7 (*)

Напишите функцию с переменным числом аргументов, которая возвращает строку с многочленом, в качестве коэффициентов которого выступают аргументы функции. Нулевых слагаемых не должно быть в полиноме. Если коэффициент равен 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";

1. The Hitchhiker's Guide to the Galaxy

About

Practice 2

License:MIT License


Languages

Language:JavaScript 100.0%