From b57bd6669c81a5f75f0b147afe0fafa57db6dbc7 Mon Sep 17 00:00:00 2001 From: BronzeHunter <121955265+BronzeHunter@users.noreply.github.com> Date: Sun, 3 Dec 2023 23:10:24 +0500 Subject: [PATCH] tasks_core.js --- src/core.js | 171 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 103 insertions(+), 68 deletions(-) diff --git a/src/core.js b/src/core.js index 9235599..6b35e64 100644 --- a/src/core.js +++ b/src/core.js @@ -1,80 +1,115 @@ -//Напишите функцию, которая проверяет, является ли число целым используя побитовые операторы -function isInteger(n) {} +// Функция, которая проверяет, является ли число целым используя побитовые операторы +function isInteger(n) { + return (n ^ 0) === n; +} -//Напишите функцию, которая возвращает массив четных чисел от 2 до 20 включительно -function even() {} +// Функция, которая возвращает массив четных чисел от 2 до 20 включительно +function even() { + const result = []; + for (let i = 2; i <= 20; i += 2) { + result.push(i); + } + return result; +} -//Напишите функцию, считающую сумму чисел до заданного используя цикл -function sumTo(n) {} +// Функция, считающая сумму чисел до заданного используя цикл +function sumTo(n) { + let sum = 0; + for (let i = 1; i <= n; i++) { + sum += i; + } + return sum; +} -//Напишите функцию, считающую сумму чисел до заданного используя рекурсию -function recSumTo(n) {} +// Функция, считающая сумму чисел до заданного используя рекурсию +function recSumTo(n) { + if (n === 1) { + return 1; + } + return n + recSumTo(n - 1); +} -//Напишите функцию, считающую факториал заданного числа -function factorial(n) {} +// Функция, считающая факториал заданного числа +function factorial(n) { + if (n === 0 || n === 1) { + return 1; + } + return n * factorial(n - 1); +} -//Напишите функцию, которая определяет, является ли число двойкой, возведенной в степень -function isBinary(n) {} +// Функция, которая определяет, является ли число двойкой, возведенной в степень +function isBinary(n) { + return (n & (n - 1)) === 0 && n !== 0; +} -//Напишите функцию, которая находит N-е число Фибоначчи -function fibonacci(n) {} +// Функция, которая находит 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) {} +// Функция, возвращающая функцию-операцию +function getOperationFn(initialValue, operatorFn) { + return function (newValue) { + if (operatorFn) { + return (initialValue = operatorFn(initialValue, newValue)); + } else { + return 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, step) {} +// Функция создания генератора арифметической последовательности +function sequence(start = 0, step = 1) { + return function () { + const current = start; + start += step; + return current; + }; +} -/** - * Напишите функцию 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) {} +// Функция deepEqual +function deepEqual(firstObject, secondObject) { + if (firstObject === secondObject) { + return true; + } + + if ( + typeof firstObject !== 'object' || + typeof secondObject !== 'object' || + firstObject === null || + secondObject === null + ) { + return false; + } + + const keysFirst = Object.keys(firstObject); + const keysSecond = Object.keys(secondObject); + + if (keysFirst.length !== keysSecond.length) { + return false; + } + + for (const 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, + isInteger, + even, + sumTo, + recSumTo, + factorial, + isBinary, + fibonacci, + getOperationFn, + sequence, + deepEqual, };