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