diff --git a/tasks/math-funcs/funcs/cesar.js b/tasks/math-funcs/funcs/cesar.js
new file mode 100644
index 0000000..16e43d5
--- /dev/null
+++ b/tasks/math-funcs/funcs/cesar.js
@@ -0,0 +1,40 @@
+function cesar(str, shift, action) {
+ const alphabet = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя';
+ const alphabetUpper = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
+ let result = '';
+
+ for (let i = 0; i < str.length; i++) {
+ let char = str[i];
+ let isUpper = false;
+ let index = -1;
+
+ if (alphabetUpper.indexOf(char) !== -1) {
+ isUpper = true;
+ index = alphabetUpper.indexOf(char);
+ } else if (alphabet.indexOf(char) !== -1) {
+ index = alphabet.indexOf(char);
+ }
+
+ if (index !== -1) {
+ let newIndex;
+ if (action === 'encode') {
+ newIndex = (index + shift) % alphabet.length;
+ } else {
+ newIndex = (index - shift + alphabet.length) % alphabet.length;
+ }
+
+ if (isUpper) {
+ result += alphabetUpper[newIndex];
+ } else {
+ result += alphabet[newIndex];
+ }
+ } else {
+ result += char;
+ }
+ }
+
+ return result;
+}
+
+// Расшифровка сообщения "эзтыхз фзъзъз" с различными сдвигами:
+// При shift = 8: "хакуна матата"
\ No newline at end of file
diff --git a/tasks/math-funcs/funcs/fibb.js b/tasks/math-funcs/funcs/fibb.js
new file mode 100644
index 0000000..f9b1778
--- /dev/null
+++ b/tasks/math-funcs/funcs/fibb.js
@@ -0,0 +1,15 @@
+function fibb(n) {
+ if (n === 0) return 0;
+ if (n === 1) return 1;
+
+ let prev = 0;
+ let current = 1;
+
+ for (let i = 2; i <= n; i++) {
+ let next = prev + current;
+ prev = current;
+ current = next;
+ }
+
+ return current;
+}
\ No newline at end of file
diff --git a/tasks/math-funcs/funcs/gcd.js b/tasks/math-funcs/funcs/gcd.js
new file mode 100644
index 0000000..8ceffb0
--- /dev/null
+++ b/tasks/math-funcs/funcs/gcd.js
@@ -0,0 +1,8 @@
+function gcd(a, b) {
+ while (b !== 0) {
+ let temp = b;
+ b = a % b;
+ a = temp;
+ }
+ return a;
+}
\ No newline at end of file
diff --git a/tasks/math-funcs/funcs/getSortedArray.js b/tasks/math-funcs/funcs/getSortedArray.js
new file mode 100644
index 0000000..42216db
--- /dev/null
+++ b/tasks/math-funcs/funcs/getSortedArray.js
@@ -0,0 +1,12 @@
+function getSortedArray(array, key) {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1 - i; j++) {
+ if (array[j][key] > array[j + 1][key]) {
+ let temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+ return array;
+}
\ No newline at end of file
diff --git a/tasks/math-funcs/funcs/minDigit.js b/tasks/math-funcs/funcs/minDigit.js
new file mode 100644
index 0000000..1b6c6ce
--- /dev/null
+++ b/tasks/math-funcs/funcs/minDigit.js
@@ -0,0 +1,11 @@
+function minDigit(x) {
+ let min = 9;
+ while (x > 0) {
+ let digit = x % 10;
+ if (digit < min) {
+ min = digit;
+ }
+ x = Math.floor(x / 10);
+ }
+ return min;
+}
\ No newline at end of file
diff --git a/tasks/math-funcs/funcs/pluralizeRecords.js b/tasks/math-funcs/funcs/pluralizeRecords.js
new file mode 100644
index 0000000..9e95830
--- /dev/null
+++ b/tasks/math-funcs/funcs/pluralizeRecords.js
@@ -0,0 +1,18 @@
+function pluralizeRecords(n) {
+ let recordForm = "записей";
+ let wasForm = "было найдено";
+
+ let lastDigit = n % 10;
+ let lastTwoDigits = n % 100;
+
+ if (lastTwoDigits >= 11 && lastTwoDigits <= 14) {
+ //pass
+ } else if (lastDigit === 1) {
+ recordForm = "запись";
+ wasForm = "была найдена";
+ } else if (lastDigit >= 2 && lastDigit <= 4) {
+ recordForm = "записи";
+ }
+
+ return `В результате выполнения запроса ${wasForm} ${n} ${recordForm}`;
+}
\ No newline at end of file
diff --git a/tasks/math-funcs/funcs/pow.js b/tasks/math-funcs/funcs/pow.js
new file mode 100644
index 0000000..2a436a6
--- /dev/null
+++ b/tasks/math-funcs/funcs/pow.js
@@ -0,0 +1,7 @@
+function pow(x, n) {
+ let result = 1;
+ for (let i = 0; i < n; i++) {
+ result *= x;
+ }
+ return result;
+}
\ No newline at end of file
diff --git a/tasks/math-funcs/index.html b/tasks/math-funcs/index.html
new file mode 100644
index 0000000..65b0d41
--- /dev/null
+++ b/tasks/math-funcs/index.html
@@ -0,0 +1,234 @@
+
+
+
+
+
+
+ Тестирование функций JavaScript
+
+
+
+
+
Тестирование функций JavaScript
+
+
+
+
1. Возведение в степень | Exponentiation
+
+ Функция pow(x,n) возвращает x в степени n. Иначе говоря, умножает x на себя n раз и возвращает результат. Функция обязана поддерживать только натуральные значения n.
+
+
function pow(x, n) {
+ let result = 1;
+ for (let i = 0; i < n; i++) {
+ result *= x;
+ }
+ return result;
+}
+
+
+
+
+
+
+
+
+
+
+
2. Нахождение НОД | Greatest common divisor (GCD)
+
+ Функция gcd(a,b) возвращает x - наибольший общий делитель двух неотрицательных чисел a и b.
+
+
function gcd(a, b) {
+ while (b !== 0) {
+ let temp = b;
+ b = a % b;
+ a = temp;
+ }
+ return a;
+}
+
+
+
+
+
+
+
+
+
+
+
3. Наименьшая цифра | Minimum digit
+
+ Функция minDigit(x) возвращает наименьшую цифру целого неотрицательного числа x.
+
+
function minDigit(x) {
+ let min = 9;
+ while (x > 0) {
+ let digit = x % 10;
+ if (digit < min) {
+ min = digit;
+ }
+ x = Math.floor(x / 10);
+ }
+ return min;
+}
+
+
+
+
+
+
+
+
+
+
4. Pluralization
+
+ Функция pluralizeRecords(n) для любого целого неотрицательного значения n вернёт строку "В результате выполнения запроса было найдено n записей", в которой для каждого слова будет образована правильная форма множественного числа, в зависимости от конкретного значения n.
+
+
function pluralizeRecords(n) {
+ let recordForm = "записей";
+ let wasForm = "было найдено";
+
+ let lastDigit = n % 10;
+ let lastTwoDigits = n % 100;
+
+ if (lastTwoDigits >= 11 && lastTwoDigits <= 14) {
+ //pass
+ } else if (lastDigit === 1) {
+ recordForm = "запись";
+ wasForm = "была найдена";
+ } else if (lastDigit >= 2 && lastDigit <= 4) {
+ recordForm = "записи";
+ }
+
+ return `В результате выполнения запроса ${wasForm} ${n} ${recordForm}`;
+}
+
+
+
+
+
+
+
+
+
+
5. Числа Фибоначчи | Fibonacci numbers
+
+ Функция fibb(n) для любого целого неотрицательного числа n <= 1000 вернёт n-ое число из последовательности Фибоначчи.
+
+
function fibb(n) {
+ if (n === 0) return 0;
+ if (n === 1) return 1;
+
+ let prev = 0;
+ let current = 1;
+
+ for (let i = 2; i <= n; i++) {
+ let next = prev + current;
+ prev = current;
+ current = next;
+ }
+
+ return current;
+}
+
+
+
+
+
+
+
+
+
+
6. Сортировка объектов | Sorting objects
+
+ Функция getSortedArray(array, key) сортирует массив объектов. У функции два параметра: array - массив объектов, оторый нужно отсортировать, и key - ключ, по значению которого нужно произвести сортировку. Порядок сортировки - по возрастанию.
+
+
function getSortedArray(array, key) {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1 - i; j++) {
+ if (array[j][key] > array[j + 1][key]) {
+ let temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+ return array;
+}
+
+
+
+
+
+
+
+
+
+
+
7. Шифр Цезаря | Caesar's cipher
+
+ Функция cesar(str, shift, action) производит шифрование и дешифровку строки str с использованием шифра Цезаря. В качестве алфавита используется русский алфавит. Параметр shift отвечает за сдвиг алфавита. Если action == 'encode', функция производит шифрование, а если action == 'decode' - дешифровку.
+
+
function cesar(str, shift, action) {
+ const alphabet = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя';
+ const alphabetUpper = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
+ let result = '';
+
+ for (let i = 0; i < str.length; i++) {
+ let char = str[i];
+ let isUpper = false;
+ let index = -1;
+
+ if (alphabetUpper.indexOf(char) !== -1) {
+ isUpper = true;
+ index = alphabetUpper.indexOf(char);
+ } else if (alphabet.indexOf(char) !== -1) {
+ index = alphabet.indexOf(char);
+ }
+
+ if (index !== -1) {
+ let newIndex;
+ if (action === 'encode') {
+ newIndex = (index + shift) % alphabet.length;
+ } else {
+ newIndex = (index - shift + alphabet.length) % alphabet.length;
+ }
+
+ if (isUpper) {
+ result += alphabetUpper[newIndex];
+ } else {
+ result += alphabet[newIndex];
+ }
+ } else {
+ result += char;
+ }
+ }
+
+ return result;
+}
+
+// Расшифровка: "эзтыхз фзъзъз" со сдвигом 8 = "хакуна матата"