# Тестирование функций 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 = "хакуна матата"