diff --git a/src/core.js b/src/core.js index 9235599..76772e1 100644 --- a/src/core.js +++ b/src/core.js @@ -1,80 +1,123 @@ -//Напишите функцию, которая проверяет, является ли число целым используя побитовые операторы -function isInteger(n) {} - -//Напишите функцию, которая возвращает массив четных чисел от 2 до 20 включительно -function even() {} - -//Напишите функцию, считающую сумму чисел до заданного используя цикл -function sumTo(n) {} - -//Напишите функцию, считающую сумму чисел до заданного используя рекурсию -function recSumTo(n) {} - -//Напишите функцию, считающую факториал заданного числа -function factorial(n) {} - -//Напишите функцию, которая определяет, является ли число двойкой, возведенной в степень -function isBinary(n) {} - -//Напишите функцию, которая находит N-е число Фибоначчи -function fibonacci(n) {} - -/** Напишите функцию, которая принимает начальное значение и функцию операции - * и возвращает функцию - выполняющую эту операцию. - * Если функция операции (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) {} - -/** - * Напишите функцию создания генератора арифметической последовательности. - * При ее вызове, она возвращает новую функцию генератор - 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, step) {} - -/** - * Напишите функцию 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) {} +// Функция, которая проверяет, является ли число целым, используя побитовые операторы +function isInteger(n) { + return (n ^ 0) === n; // Используем побитовую операцию XOR для проверки целого числа +} + +// Функция, которая возвращает массив четных чисел от 2 до 20 включительно +function even() { + const evenNumbers = []; + for (let i = 2; i <= 20; i += 2) { + evenNumbers.push(i); + } + return evenNumbers; +} + +// Функция, считающая сумму чисел до заданного используя цикл +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) { + if (n <= 0) { + return false; + } + return (n & (n - 1)) === 0; // Проверяем, содержит ли число только одну единицу в двоичном представлении, исключая 0 +} + +// Функция, которая находит N-е число Фибоначчи +function fibonacci(n) { + if (n <= 1) { + return n; + } + let a = 0; + let b = 1; + let temp; + for (let i = 2; i <= n; i++) { + temp = a + b; + a = b; + b = temp; + } + return b; +} + +// Функция, которая возвращает функцию для выполнения операции +function getOperationFn(initialValue, operatorFn = (a, b) => a) { + let storedValue = initialValue; + return function (newValue) { + storedValue = operatorFn(storedValue, newValue); + return storedValue; + }; +} + +// Функция для создания генератора арифметической последовательности +function sequence(start = 0, step = 1) { + return function generator() { + const currentValue = start; + start += step; + return currentValue; + }; +} + +// Функция для сравнения объектов на их глубокое равенство +function deepEqual(firstObject, secondObject) { + if (firstObject !== firstObject && secondObject !== secondObject) { + return true; // Проверяем на NaN и возвращаем true, если оба NaN + } + + if (firstObject === secondObject) { + return true; + } + + if (typeof firstObject !== 'object' || typeof secondObject !== 'object') { + return false; + } + + const keys1 = Object.keys(firstObject); + const keys2 = Object.keys(secondObject); + + if (keys1.length !== keys2.length) { + return false; + } + + for (const key of keys1) { + if (!keys2.includes(key) || !deepEqual(firstObject[key], secondObject[key])) { + return false; + } + } + + return true; +} + module.exports = { - isInteger, - even, - sumTo, - recSumTo, - factorial, - isBinary, - fibonacci, - getOperationFn, - sequence, - deepEqual, + isInteger, + even, + sumTo, + recSumTo, + factorial, + isBinary, + fibonacci, + getOperationFn, + sequence, + deepEqual, };