From c5b986cf10bfdc367eafb92892c920d018a890a2 Mon Sep 17 00:00:00 2001 From: Timur Date: Sun, 10 Dec 2023 15:28:48 +0300 Subject: [PATCH] =?UTF-8?q?=D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D1=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- task2/core.js | 153 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 task2/core.js diff --git a/task2/core.js b/task2/core.js new file mode 100644 index 0000000..c01b7fc --- /dev/null +++ b/task2/core.js @@ -0,0 +1,153 @@ +//Напишите функцию, которая проверяет, является ли число целым используя побитовые операторы +function isInteger(n) { + return (n ^ 0) === n; +} + + +//Напишите функцию, которая возвращает массив четных чисел от 2 до 20 включительно +function even() { + let arr = []; + for (let i = 2; i <= 20; i += 2) { + arr.push(i); + } + return arr; +} + + +//Напишите функцию, считающую сумму чисел до заданного используя цикл +function sumTo(n) { + let sum = 0; + for (let i = 1; i <= n; i++) { + sum += i; + } + return sum; +} + + +//Напишите функцию, считающую сумму чисел до заданного используя рекурсию +function recSumTo(n) { + if (n === 1) return 1; + return n + recSumTo(n - 1); +} + + +//Напишите функцию, считающую факториал заданного числа +function factorial(n) { + if (n === 0 || n === 1) return 1; + return n * factorial(n - 1); +} + + +//Напишите функцию, которая определяет, является ли число двойкой, возведенной в степень +function isBinary(n) { + return n > 0 && (n & (n - 1)) === 0; +} + + +//Напишите функцию, которая находит N-е число Фибоначчи +function fibonacci(n) { + if (n <= 1) return n; + return fibonacci(n - 1) + fibonacci(n - 2); +} + + +/** Напишите функцию, которая принимает начальное значение и функцию операции + * и возвращает функцию - выполняющую эту операцию. + * Если функция операции (operatorFn) не задана - по умолчанию всегда + * возвращается начальное значение (initialValue) + * @param initialValue + * @param operatorFn - (storedValue, newValue) => {operation} + * @example + * const sumFn = getOperationFn(10, (a,b) => a + b); + * console.log(sumFn(5)) - 15 + * console.log(sumFn(3)) - 18 + */ +function getOperationFn(initialValue, operatorFn) { + return operatorFn ? (newValue) => operatorFn(initialValue, newValue) : () => initialValue; +} + + +/** + * Напишите функцию создания генератора арифметической последовательности. + * При ее вызове, она возвращает новую функцию генератор - generator(). + * Каждый вызов функции генератора возвращает следующий элемент последовательности. + * Если начальное значение не передано, то оно равно 0. + * Если шаг не указан, то по дефолту он равен 1. + * Генераторов можно создать сколько угодно - они все независимые. + * + * @param {number} start - число с которого начинается последовательность + * @param {number} step - число шаг последовательности + * @example + * const generator = sequence(5, 2); + * console.log(generator()); // 5 + * console.log(generator()); // 7 + * console.log(generator()); // 9 + */ +function sequence(start = 0, step = 1) { + let current = start; + return function () { + let returnValue = current; + current += step; + return returnValue; + }; +} + + +/** + * Напишите функцию deepEqual, которая принимает два значения + * и возвращает true только в том случае, если они имеют одинаковое значение + * или являются объектами с одинаковыми свойствами, + * значения которых также равны при сравнении с рекурсивным вызовом deepEqual. + * Учитывать специфичные объекты(такие как Date, RegExp итп) не обязательно + * + * @param {object} firstObject - первый объект + * @param {object} secondObject - второй объект + * @returns {boolean} - true если объекты равны(по содержанию) иначе false + * @example + * deepEqual({arr: [22, 33], text: 'text'}, {arr: [22, 33], text: 'text'}) // true + * deepEqual({arr: [22, 33], text: 'text'}, {arr: [22, 3], text: 'text2'}) // false + */ +function deepEqual(firstObject, secondObject) { + // Проверка на прямое равенство + if (firstObject === secondObject) { + return true; + } + + // Проверка, что оба аргумента являются объектами + if (typeof firstObject !== 'object' || firstObject === null || + typeof secondObject !== 'object' || secondObject === null) { + return false; + } + + // Получение ключей обоих объектов + let keysFirst = Object.keys(firstObject); + let keysSecond = Object.keys(secondObject); + + // Проверка на количество ключей + if (keysFirst.length !== keysSecond.length) { + return false; + } + + // Рекурсивное сравнение каждого свойства объектов + for (let key of keysFirst) { + if (!keysSecond.includes(key) || !deepEqual(firstObject[key], secondObject[key])) { + return false; + } + } + + return true; +} + + +module.exports = { + isInteger, + even, + sumTo, + recSumTo, + factorial, + isBinary, + fibonacci, + getOperationFn, + sequence, + deepEqual, +};