{"id":19831544,"url":"https://github.com/notacat1/javascript-algorithms","last_synced_at":"2025-02-28T17:43:34.220Z","repository":{"id":192386022,"uuid":"658607434","full_name":"NotACat1/javascript-algorithms","owner":"NotACat1","description":"This compilation is a small collection of algorithmic problems designed to test your knowledge of JavaScript.","archived":false,"fork":false,"pushed_at":"2023-06-27T11:56:36.000Z","size":43,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-11T10:17:33.406Z","etag":null,"topics":["algorithm-challenges","javascript"],"latest_commit_sha":null,"homepage":"","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NotACat1.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2023-06-26T06:31:18.000Z","updated_at":"2023-09-03T11:43:40.000Z","dependencies_parsed_at":"2023-09-04T16:29:11.727Z","dependency_job_id":null,"html_url":"https://github.com/NotACat1/javascript-algorithms","commit_stats":null,"previous_names":["notacat1/javascript-algorithms"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NotACat1%2Fjavascript-algorithms","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NotACat1%2Fjavascript-algorithms/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NotACat1%2Fjavascript-algorithms/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NotACat1%2Fjavascript-algorithms/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NotACat1","download_url":"https://codeload.github.com/NotACat1/javascript-algorithms/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241191532,"owners_count":19925285,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["algorithm-challenges","javascript"],"created_at":"2024-11-12T11:32:41.938Z","updated_at":"2025-02-28T17:43:34.196Z","avatar_url":"https://github.com/NotACat1.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Небольшой сборник алгоритмических задач\n\n## Обзор\n\nВ этом репозитории вы найдёте 14 директорий для каждой из задач. Каждая директория содержит файл `index.html` для запуска алгоритма и файл `script.js`, где вам предстоит написать решения.\n\n---\n\n## Задача 1: «Палиндром»\n\n**Палиндром** — это слово, предложение или последовательность символов, которая читается слева направо так же, как и справа налево. Например, «топот» и «Анна» — палиндромы, а «привет» и «Витя» — нет.\n\nНапишите функцию `palindrome(str)`, принимающую как аргумент строку. Функция должна вернуть `true`, если строка — палиндром, и `false`, если нет.\n\nСчитайте, что на вход всегда передаётся слово: то есть знаков препинания и пробелов в аргументе быть не может.\n\n```js\nfunction palindrome(str) {\n  const checkStr = str.toLowerCase().replace(/[^a-zа-я]+/g, ''); // перевод в нижний регистр + избавление в строке от пробелов и знаков припинания\n  let leftBorder = 0; // индекс левого символа\n  let rightBorder = checkStr.length - 1; // индекс правого символа\n  while (leftBorder \u003c= rightBorder) {\n    if (checkStr[leftBorder] != checkStr[rightBorder]) return false;\n    leftBorder++;\n    rightBorder--;\n  }\n  return true;\n}\n```\n\n---\n\n## Задача 2: «FizzBuzz»\n\nНапишите функцию `fizzBuzz(n)`, принимающую как аргумент натуральное число. Функция должна выводить в консоль числа от 1 до `n`, заменяя числа:\n\n* кратные трём — на `fizz`;\n* кратные пяти — на `buzz`;\n* кратные и трём, и пяти одновременно — на `fizzbuzz`.\n\n```js\nfunction fizzBuzz(num) {\n  for (let itemNumber = 1; itemNumber \u003c= num; itemNumber++) {\n    let strRez = '';\n    if (itemNumber % 3 === 0) strRez += 'fizz';\n    if (itemNumber % 5 === 0) strRez += 'buzz';\n    console.log(strRez || itemNumber);\n  }\n}\n```\n\n---\n\n## Задача 3: «Развернуть слова в предложении»\n\nНапишите функцию `reverseWords(str)`, принимающую на вход строку. Функция должна вернуть новую строку, расставив слова в обратном порядке. Если в строке есть знаки препинания, их можно удалить или оставить — на ваше усмотрение.\n\n```js\nfunction reverseWords(str) {\n  return str.trim().replace(/[^a-zA-Zа-яА-Я ]+/g, '').split(' ').reverse().join(' ');\n}\n```\n\n---\n\n## Задача 4: «С большой буквы»\n\nНапишите функцию `capitalize(str)`. Функция должна возвращать новую строку каждое слово в которой начинается с прописной буквы.\n\n```js\nfunction capitalize(str) {\n  return str.split(' ').map((wordStr) =\u003e wordStr.length !== 0 ? wordStr[0].toUpperCase() + wordStr.slice(1) : '').join(' ');\n}\n```\n\n---\n\n## Задача 5: «Найти гласные»\n\nНапишите функцию `findVowels(str)`, принимающую на вход кириллическую строку `str`  и возвращающую количество гласных, содержащихся в этой строке.\n\nДля вашего удобства вот массив кириллических гласных:\n\n```js\n['а', 'я', 'о', 'ё', 'у', 'ю', 'ы', 'и', 'э', 'е'].\n```\n\n```js\nfunction findVowels(str) {\n  const arrVowelLetters = ['а', 'я', 'о', 'ё', 'у', 'ю', 'ы', 'и', 'э', 'е'];\n  return str.toLowerCase().split('').reduce((colVowels, letterStr) =\u003e arrVowelLetters.includes(letterStr) ? colVowels + 1 : colVowels, 0);\n}\n```\n\n---\n\n## Задача 6: «Уникальные числа»\n\nНапишите функцию `uniq(arr)`, принимающую на вход массив целых чисел. Функция должна возвращать массив уникальных чисел, которые содержатся в переданном массиве. То есть, дубликаты должны быть удалены.\n\n```js\nfunction uniq(arr) {\n  return arr.filter((numberArr, indexNumberArr, selfArr) =\u003e indexNumberArr === selfArr.indexOf(numberArr));\n}\n```\n\n---\n\n## Задача 7: «Анаграмма»\n\nДва слова называют **анаграммами**, если они состоят из одних и тех же букв.\n\nНапишите функцию, проверяющую, являются ли две строки анаграммами друг друга (регистр букв не имеет значения). Для простоты примите, что в этих строках нет пробелов и знаков препинания.\n\n```js\nfunction anagram(str1, str2) {\n  return sortLettersWord(str1) === sortLettersWord(str2);\n}\n\nfunction sortLettersWord(str) {\n  return str.toLowerCase().split('').sort().join('');\n}\n```\n\n---\n\n## Задача 8: «Фибоначчи»\n\n**Последовательность Фибоначчи** — это порядок чисел, где каждое последующее число является суммой двух предыдущих: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.\n\nНапишите функцию, которая принимает на вход число `n` и возвращает n-й элемент последовательности Фибоначчи.\n\n```js\nfunction fibonacci(n) {\n  let maxArrFibonacci = arrFibonacci.length;\n  while (n \u003e arrFibonacci.length) {\n    arrFibonacci.push(arrFibonacci[maxArrFibonacci - 2] + arrFibonacci[maxArrFibonacci - 1]);\n    maxArrFibonacci++;\n  }\n  return arrFibonacci[n - 1];\n}\n\nconst arrFibonacci = [0, 1];\n```\n\n---\n\n## Задача 9: «Простое число»\n\nНапишите функцию `isPrime(n)` для проверки, простое число `n` или нет. Напомним, что число называют простым, если оно больше 1 и делится без остатка только на 1 и на само себя.\n\nНа вход функция должна принимать число `n` и возвращать `true`, если `n` простое, и `false` — если нет.\n\n**Тест простоты Ферма** в теории чисел — это тест простоты натурального числа n, основанный на малой теореме Ферма.\n\nАлгоритм теста Ферма расписан в [статье Хабр](https://habr.com/ru/articles/205318/).\n\n```js\n// Тест Ферма\nfunction isPrime(n) {\n  if (n \u003c 2) return false;\n  if (n === 2) return true;\n  const k = 4;\n  for (let i = 0; i \u003c k; i++) {\n    let a = randomIntNumber(2, n - 2);\n    if (GCD(a, n) !== 1 || powModular(a, n - 1, n) !== 1) return false;\n  }  \n  return true;\n}\n```\n\nВозведение в степень по модулю — одна из операций над натуральными числами — возведение в степень, — выполняемая по модулю. Находит применение в информатике, особенно, в области криптографии с открытым ключом.\n\nВозведение в степень по модулю — это вычисление остатка от деления натурального числа a (основание), возведенного в степень n (показатель степени), на натуральное число m (модуль).\n\nАлгоритм быстрого возведения в степень расписана в [статье](https://ru.wikipedia.org/wiki/Возведение_в_степень_по_модулю).\n\n```js\n// Быстрое возведение в степень по модулю\n// Информация: https://ru.wikipedia.org/wiki/Возведение_в_степень_по_модулю\nfunction powModular(base, index, modulus) {\n  let c = 1;\n  for (let i = 1; i \u003c= index; i++) {\n    c = (c * base) % modulus;\n  }\n  return c;\n}\n```\n\nДля нахождения наибольшего общего делителя (НОД) воспользуемся [алгоритмом Евклида](https://ru.wikipedia.org/wiki/Алгоритм_Евклида).\n\n```js\n// Нахождение НОД\n// Информация: https://ru.wikipedia.org/wiki/Алгоритм_Евклида\nfunction GCD(a, b) {\n  if (b === 0) return a;\n  return GCD(b, a % b);\n}\n```\n\nГенерация случайного целого числа в диапозоне от `min` до `max` позаимствована:\n\n```js\n// Случайное целое число в интервале от min до max\nfunction randomIntNumber(min, max) {\n  return Math.floor(min + Math.random() * (max + 1 - min));\n}\n```\n\n---\n\n## Задача 10: «Факториал»\n\nНапишите функцию `factorial(n)`, возвращающую факториал неотрицательного целого числа. Факториал — это произведение всех натуральных чисел от 1 до `n` включительно. Факториал 0 равен 1.\n\n```js\nfunction factorial(n) {\n  for (let i = factorialNumbers.length; i \u003c= n; i++) {\n    factorialNumbers.push(factorialNumbers[i - 1] * i);\n  }\n  return factorialNumbers[n];\n}\n\nconst factorialNumbers = [1];\n```\n\n---\n\n## Задача 11: «Пересечения массивов»\n\nНапишите функцию `intersection(arr1, arr2)`. Она должна принимать на вход два массива целых чисел. Функция должна вернуть новый массив чисел, содержащихся в обоих исходных массивах.\n\n```js\nfunction intersection(arr1, arr2) {\n  const rez = [];\n  arr1.forEach(item =\u003e { if (arr2.includes(item) \u0026\u0026 !rez.includes(item)) rez.push(item); });\n  return rez;\n}\n```\n\n---\n\n## Задача 12: «Посчитать количество нулей»\n\nНапишите функцию `countZeros(n)`, принимающую на вход натуральное число `n`. Возвращать функция должна суммарное количество нулей, содержащихся во всех числах от 1 до `n` включительно.\n\n```js\nfunction countZeros(n) {\n  let colZeros = 0;\n  for (let number = 10; number \u003c= n; number++) {\n    colZeros += (number + '').replace(/[1-9]+/g, '').length;\n  }\n  return colZeros;\n}\n```\n\n---\n\n## Задача 13: «Сумма двух»\n\nНапишите функцию `sumOfTwo(arr, num)`. Её аргументы: массив целых чисел `arr` и целое число `num`. Функция должна вернуть `true`, если в переданном массиве есть какие-то два числа, чья сумма равна num. Если же такой пары чисел нет, функция должна вернуть `false`.\n\n```js\nfunction sumOfTwo(arr, sum) {\n  let indexArr = 0;\n  let flgFunct = false;\n  while (Math.ceil(arr.length / 2) \u003e= indexArr \u0026\u0026 !flgFunct) {\n    flgFunct = arr.includes(sum - arr[indexArr], indexArr);\n    indexArr++;\n  }\n  return flgFunct;\n}\n```\n\n---\n\n## Задача 14: «Простые числа»\n\nНапишите функцию `primes(n)`. Её единственный аргумент — целое число `n`. Функция должна возвращать массив простых чисел от 2 до `n`.\n\n```js\nfunction primes(num) {\n  for (let number = arrPrimes[arrPrimes.length - 1] + 1; num \u003e= number; number++) {\n    if (isPrime(number)) arrPrimes.push(number);\n  }\n  let indexArrPrimes = 0;\n  while (num \u003e= arrPrimes[indexArrPrimes]) {\n    indexArrPrimes++;\n  }\n  return arrPrimes.slice(0, indexArrPrimes);\n}\n```\n\n**Тест простоты Ферма** в теории чисел — это тест простоты натурального числа n, основанный на малой теореме Ферма.\n\nАлгоритм теста Ферма расписан в [статье Хабр](https://habr.com/ru/articles/205318/).\n\n```js\n// Тест Ферма\nfunction isPrime(n) {\n  if (n \u003c 2) return false;\n  if (n === 2) return true;\n  const k = 4;\n  for (let i = 0; i \u003c k; i++) {\n    let a = randomIntNumber(2, n - 2);\n    if (GCD(a, n) !== 1 || powModular(a, n - 1, n) !== 1) return false;\n  }  \n  return true;\n}\n```\n\nВозведение в степень по модулю — одна из операций над натуральными числами — возведение в степень, — выполняемая по модулю. Находит применение в информатике, особенно, в области криптографии с открытым ключом.\n\nВозведение в степень по модулю — это вычисление остатка от деления натурального числа a (основание), возведенного в степень n (показатель степени), на натуральное число m (модуль).\n\nАлгоритм быстрого возведения в степень расписана в [статье](https://ru.wikipedia.org/wiki/Возведение_в_степень_по_модулю).\n\n```js\n// Быстрое возведение в степень по модулю\n// Информация: https://ru.wikipedia.org/wiki/Возведение_в_степень_по_модулю\nfunction powModular(base, index, modulus) {\n\tlet c = 1;\n  for (let i = 1; i \u003c= index; i++) {\n    c = (c * base) % modulus;\n  }\n  return c;\n}\n```\n\nДля нахождения наибольшего общего делителя (НОД) воспользуемся [алгоритмом Евклида](https://ru.wikipedia.org/wiki/Алгоритм_Евклида).\n\n```js\n// Нахождение НОД\n// Информация: https://ru.wikipedia.org/wiki/Алгоритм_Евклида\nfunction GCD(a, b) {\n  if (b === 0) return a;\n  return GCD(b, a % b);\n}\n```\n\nГенерация случайного целого числа в диапозоне от `min` до `max` позаимствована:\n\n```js\n// Случайное целое число в интервале от min до max\nfunction randomIntNumber(min, max) {\n  return Math.floor(min + Math.random() * (max + 1 - min));\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnotacat1%2Fjavascript-algorithms","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnotacat1%2Fjavascript-algorithms","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnotacat1%2Fjavascript-algorithms/lists"}