Напишите программу, которая определяет, является ли массив размера N перестановкой числе над 1,2...N (т. е. содержащих каждое из чисел 1,2...N ровно один раз.

#include <stdio.h>

#include "test.h"

#define N 9

/**
 * Определяет, является ли данный массив перестановкой над N, т.е.
 * массив array[N] содержит все числа от 1 до N, включительно.
 * Например: 1,3,4,2,5,7,6,9,8 - является перестановкойнад 9.
 * 1,2,4,3,3,5,2,8,9 - не является перестановкой.
 *
 * Подсказки:
 * - создайте вспомогательный массив размера N;
 * - задачу можно решить за O(N);
 *
 * @param array Массив, который проверяем на перестановку
 * @return Возвращает 1, если является перестановкой, иначе 0.
 */
int is_permutation(int array[N]) {
  int counters[N];
  for (int i = 0; i < N; i++) {
    counters[i] = 0;
  }

  // array =    1 3 4 1 5 7 6 9 8
  // counters = 2 0 1 1 1 1 1 1 1

  for (int i = 0; i < N; i++) {
    int key = array[i] - 1;
    if (array[i] < 0 || key >= N) {
      return 0;
    }
    counters[key] += 1;
    if (counters[key] > 1) {
      return 0;
    }
  }

  // проверка что все элементы 1 не нужна

  return 1;
}

void test(void) {
  // Это тесты. НЕ УДАЛЯЙТЕ ИХ!
  // Преподаватель будет грустить, если вы удалите тесты T_T.
  // Тесты проверяют, что ваш код работает правильно.
  // Если задача решена неправильно,
  // то в консоли вы увидите ошибку и пояснение.
  // Сдавайте лабу, когда устраните все ошибки в тестах.
  // Если возникли трудности, то попросите преподавателя вам помочь ^_^.

  {
    int arr[N] = {1, 3, 4, 2, 5, 7, 6, 9, 8};
    ASSERT_TRUE(is_permutation(arr));
  }
  {
    int arr[N] = {8, 3, 4, 2, 5, 9, 6, 7, 1};
    ASSERT_TRUE(is_permutation(arr));
  }

  {
    int arr[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    ASSERT_TRUE(is_permutation(arr));
  }

  {
    int arr[N] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
    ASSERT_FALSE(is_permutation(arr));
  }

  {
    int arr[N] = {1, 2, 4, 3, 3, 5, 2, 8, 9};
    ASSERT_FALSE(is_permutation(arr));
  }
}

int main(void) {
  test();
  return 0;
}