---
metadata:
  - name: generator
    content: Diplodoc Platform v5.48.2
alternate:
  - https://admin.contest.yandex.ru/docs/en/problem/checkers.md
  - https://admin.contest.yandex.ru/docs/ru/problem/checkers.md
---
> **Documentation Index:** Fetch the complete configuration index at https://admin.contest.yandex.ru/docs/ru/llms.txt

# Чекеры

<!-- source: ru/_includes/reusables/id-reusables/checker-about.md -->
Чекер&nbsp;— это программа, которая проверяет вывод кода участника и сообщает результат системе в виде кодов возврата. Чекер помогает автоматизировать проверку задач и избежать лишней работы при выставлении баллов.
<!-- endsource: ru/_includes/reusables/id-reusables/checker-about.md -->

Прочтите условия задачи и выделите те, которые необходимо проверить чекером. Часто задачи по программированию предполагают однозначный вывод и не требуют сложных проверок, поэтому их можно проверить [стандартными&#160;чекерами](#task).

Если вы не нашли стандартный чекер, который подходит вашей задаче, то [создайте собственный](#about-checker).

## Стандартный чекер {#task}

Чтобы добавить стандартный чекер в свою задачу:

1\. Откройте задачу и в меню слева выберите **Настройки чекера**.

2\. Выберите тип чекера **STANDARD_CHECKER**.

3\. В поле **ID чекера** выберите название стандартного чекера. 

В Контесте используются стандартные проверяющие программы и собственные:

{% cut "Стандартные проверяющие программы" %}

* **fcmp**&#160;— сравнивает файлы построчно, игнорирует пробелы на концах строк.
* **hcmp**&#160;— сравнивает два целых числа со знаком любой длины.
* **icmp**&#160;— сравнивает два 32-битных целых числа со знаком.
* **lcmp**&#160;— сравнивает файлы в виде последовательностей токенов в строках.
* **ncmp**&#160;— сравнивает последовательности 32-битных целых чисел со знаком.
* **rncmp**&#160;— сравнивает два вещественных числа с максимальной абсолютной погрешностью 1,5 X 10^-5^.
* **rncmpN**&#160;— сравнивает два вещественных числа с максимальной абсолютной погрешностью 10^-N^.
* **wcmp**&#160;— сравнивает файлы, игнорируя лишние пробелы и переносы между словами.
* **yesno**&#160;— сравнивает два ответа `YES` или `NO` независимо от регистра.
* **cmp_file**&#160;— построчно сравнивает два файла. Выбран по умолчанию.
* **cmp_file_nospace**&#160;— сравнивает два файла с игнорированием повторяющихся пробелов.
* **cmp_bytes**&#160;— побайтово сравнивает два файла.
* **cmp_int**&#160;— сравнивает два 32-битных целых числа со знаком.
* **cmp_int_seq**&#160;— сравнивает две последовательности 32-битных целых чисел со знаком.
* **cmp_long_long**&#160;— сравнивает два 64-битных целых числа со знаком.
* **cmp_long_long_seq**&#160;— сравнивает две последовательности 64-битных целых чисел со знаком.
* **cmp_unsigned_int**&#160;— сравнивает два 32-битных целых числа без знака.
* **cmp_unsigned_int_seq**&#160;— сравнивает две последовательности 32-битных целых чисел без знака.
* **cmp_unsigned_long_long**&#160;— сравнивает два 64-битных целых числа без знака.
* **cmp_unsigned_long_long_seq**&#160;— сравнивает две последовательности 64-битных целых чисел без знака.
* **cmp_huge_int**&#160;— сравнивает два целых числа произвольного размера.
* **cmp_double**&#160;— сравнивает два вещественных числа двойной точности с заданной максимальной ошибкой.
* **сmp_double_seq**&#160;— сравнивает две последовательности вещественных чисел двойной точности с заданной максимальной ошибкой.
* **cmp_long_double**&#160;— сравнивает два вещественных числа расширенной точности с заданной максимальной ошибкой.
* **cmp_long_double_seq**&#160;— сравнивает две последовательности вещественных чисел расширенной точности с заданной максимальной ошибкой.
* **cmp_sexpr**&#160;— сравнивает два S-выражения в синтаксисе языка Lisp.
* **cmp_yesno**&#160;— сравнивает два ответа `YES` или `NO` зависимо от регистра.
* **cmp_range**&#160;— проверяет наличие ответа в указанном диапазоне с максимальной абсолютной погрешностью 10^-8^.
                
{% endcut %}


   {% cut "Проверяющие программы Контеста" %}

* **ok**&#160;— всегда возвращает `ОК`. Полезен для [интерактивных](https://admin.contest.yandex.ru/docs/ru/examples/interactive.md) и [Make](https://admin.contest.yandex.ru/docs/ru/examples/advanced-usage/default-tests-for-language.md)-задач.
* **rangencmp**&#160;— проверяет наличие ответа в заданном интервале. В качестве правильного ответа принимает файл с двумя вещественными числами — минимальный и максимальный возможный ответ. В качестве ответа участника ожидается файл с одним вещественным числом.
* **regexcmp**&#160;— сравнивает ответ участника с [регулярным выражением](https://en.cppreference.com/w/cpp/regex/ecmascript). В качестве правильного ответа принимается файл с регулярным выражением.
* **anycmp**&#160;— проверяет наличие ответа участника в указанных строках. В качестве правильного ответа принимается файл, в котором каждая строка является правильным вариантом ответа. В качестве ответа участника принимается файл с одной строкой.

{% endcut %}

4\. [Настройте чекер](#to-set-checker).

5\. Справа внизу нажмите кнопку **Сохранить**.


## Свой чекер {#about-checker}

Чекер можно написать при помощи библиотеки [testlib.h](https://github.com/MikeMirzayanov/testlib) для С++ или на любом другом языке.

{% list tabs %}

- С++
  
  1. Создайте файл с решением задачи&nbsp;— с ним будет сравниваться ответ участника.
  2. Получите содержимое:
      - входных данных теста&nbsp;— находятся в переменной `inf`;
      - вывода решения участника&nbsp;— в переменной `ouf`;
      - правильного ответа&nbsp;— в переменной `ans`.
      
      {% cut "Пример" %}
      
      <!-- source: ru/_includes/reusables/id-reusables/files-example.md -->
      Этот код получает доступ к файлам входных данных, решения и правильного ответа и сохраняет их в переменные:
      <!-- endsource: ru/_includes/reusables/id-reusables/files-example.md -->
      
      ```
      #include "testlib.h"
      
      int main(int argc, char* argv[]) {
      // Функция инициализирует окружение чекера.
        registerTestlibCmd(argc, argv);
        
        // Функции считывают входные данные чекера, правильный ответ и
        // результат работы программы участника.
        int inf = inf.readInt();
        int solution = ouf.readInt();
        int answer = ans.readInt();
      }
      ```
      
      {% endcut %}
      
  3. Добавьте проверку решения.
      
      {% cut "Пример" %}
      
      ```
      // Функция проверяет, что ответ участника не равен правильному ответу.
      if (answer != solution)
        // Если ответ неверный, выводит информацию об ошибке
        quitf(_wa, "expected %d, found %d", answer, solution);
      ```
      
      {% endcut %}
      
  4. Выставьте вердикт и баллы.

      <!-- source: ru/_includes/reusables/id-reusables/verdict-1.md -->
      Чекер сообщает вердикт системе в коде ответа и может выставлять баллы, если включена опция **Чекер выставляет баллы**. Первое число из первой строки, выведенной чекером, используется как баллы за тест. Баллы выставляются только в случае вердикта `ОК`.
      <!-- endsource: ru/_includes/reusables/id-reusables/verdict-1.md -->
      
      Воспользуйтесь функцией `quitp(score, message)` для выставления баллов, где `score`&nbsp;— это выставляемые баллы, а `message`&nbsp;— дополнительное сообщение, которое может быть показано участнику и содержать вердикт.
      
      {% cut "Пример" %}
      
      Тест получит вердикт `OK` и 10,42 балла:
      
      ```
      // Функция проверяет, что ответ участника равен правильному ответу.
      if (answer == solution) {
        // Если ответ верный, возвращает балл
        quitp(10.42, "OK");
      } else {
        // Иначе возвращает вердикт WA
        quitf(_wa, "Expected: %d, found: %d", answer, solution);
      }
      ```
      
      {% endcut %}
      
  5. Протестируйте чекер на каждом из возможных вариантов вывода.
  6. Добавьте чекер в систему Контеста:
      
      1. Откройте задачу и в меню слева выберите **Настройки чекера**.
      2. Нажмите кнопку **Скомпилировать чекер**. В открывшемся окне выберите исходный код из файлов задачи либо загрузите его с устройства.
      
      3. Выберите компилятор. Воспользуйтесь последними версиями GNU GCC для чекеров на C++. Во время компиляции в окружении файла будет доступна встроенная библиотека testlib.h, файл может к ней обращаться.
      4. Выберите тип чекера **TESTLIB_EXITCODE_CHECKER**.
      5. Нажмите кнопку **Компилировать**. Когда компиляция завершится, поля **Тип чекера** и **Окружение** заполнятся указанными в окне значениями, а внизу раздела **Настройки чекера** появится скомпилированный файл.
      6. [Настройте чекер](#to-set-checker).
      7. Справа внизу нажмите кнопку **Сохранить**.
      
  Вы можете посмотреть пример чекера, который сравнивает `answer` и `solution`, ожидая в каждом из них по одному целому числу:
  
  {% cut "Пример чекера" %}
  
  
  ```
  #include "testlib.h"
  
  using namespace std;
  
  int main(int argc, char* argv[]) {
      // Функция инициализирует окружение чекера.
      registerTestlibCmd(argc, argv);
  
      // Функции считывают правильный ответ и результат работы участника.
      int answer = ans.readInt();
      int solution = ouf.readInt();
  
      // Функция проверяет, что ответ участника равен правильному ответу.
      if (answer == solution) {
          // Если ответ верный, возвращает балл
          quitp(10.42, "OK");
      } else {
         // Иначе возвращает вердикт WA
         quitf(_wa, "Expected: %d, found: %d", answer, solution);
      }
  }
  ```
  
  {% endcut %}
  
  Подробнее о том, как писать собственные чекеры, читайте в репозитории [testlib.h](https://github.com/MikeMirzayanov/testlib) (GitHub) и в блоге [Чекеры, testlib.h и просто по теме](http://codeforces.com/blog/entry/1292) (Codeforces).
  
- Другие языки

  
  1. Создайте файл с решением задачи&nbsp;— с ним будет сравниваться ответ участника.
  2. Получите содержимое:
      - файла входных данных теста&nbsp;— путь к нему находится в первом аргументе запуска чекера;
      - файла вывода решения участника&nbsp;— во втором аргументе;
      - файла с правильным ответом&nbsp;— в третьем аргументе.
      
      {% cut "Пример на Python" %}
      
      Этот код получает доступ к файлам входных данных, решения и правильного ответа и сохраняет их в переменные:
      
      ```
      import sys
      
      # Получаем пути к файлам.
      testFile = sys.argv[1]
      solutionResultFile = sys.argv[2]
      answerFile = sys.argv[3]
      
      # Открываем файлы для чтения.
      tFile = open(testFile, mode="r")
      sFile = open(solutionResultFile, mode="r")
      aFile = open(answerFile, mode="r")
      
      # Преобразуем полученные значения в строки и записываем в переменные.
      t = tFile.readline().strip()
      a = aFile.readline().strip()
      s = sFile.readline().strip()
      ```
      
      {% endcut %}
      
  3. Добавьте проверку решения.
      
      {% cut "Пример на Python" %}
      
      ```
      # Проверяем равенство значений переменных и сообщаем вердикт
      if (a == s):
        print('OK')
      else:
        print('WA')
      ```
      
      {% endcut %}
      
  4. Выставьте вердикт и баллы.
      Чекер сообщает вердикт системе в коде ответа и может выставлять баллы, если включена опция **Чекер выставляет баллы**. Первое число из первой строки, выведенной чекером, используется как баллы за тест. Баллы выставляются только в случае вердикта `ОК`.
      
      Коды вердиктов:
      
      - **0** соответствует вердикту `ОК`&nbsp;— ответ участника верен;
      - **1** соответствует вердикту `WA`&nbsp;— ответ неверен;
      - **2** соответствует вердикту `PE`&nbsp;— ответ не соответствует формату вывода.
      
      {% cut "Пример на Python" %}
      
      Тест получит вердикт PE:
      
      ```
      sys.exit(2)
      ```
      
      Если включена опция **Чекер выставляет баллы**, тест получит 10,42 балла:
      
      ```
      print('10.42 Not perfect')
      ```
      
      {% endcut %}
      
  5. Протестируйте чекер на каждом из возможных вариантов вывода.
  6. Добавьте чекер в систему Контеста:
      
      1. Откройте задачу и в меню слева выберите **Настройки чекера**.
      2. Нажмите кнопку **Скомпилировать чекер**. В открывшемся окне выберите исходный код из файлов задачи либо загрузите его с устройства.
      
      3. Выберите компилятор. Воспользуйтесь последними версиями GNU GCC для чекеров на C++. Во время компиляции в окружении файла будет доступна встроенная библиотека testlib.h, файл может к ней обращаться.
      4. Выберите тип чекера **TESTLIB_EXITCODE_CHECKER**.
      5. Нажмите кнопку **Компилировать**. Когда компиляция завершится, поля **Тип чекера** и **Окружение** заполнятся указанными в окне значениями, а внизу раздела **Настройки чекера** появится скомпилированный файл.
      6. [Настройте чекер](#to-set-checker).
      7. Справа внизу нажмите кнопку **Сохранить**. 
  
  Вы можете посмотреть пример простого чекера, который сравнивает значения во входном и выходном файлах и обрезает в них пробелы и переносы:
  
  {% cut "Пример чекера на Python" %}
  
  ```
  import sys
  
  
  # Получаем путь к файлам.
  solutionResultFile = sys.argv[2]
  answerFile = sys.argv[3]
  
  # Открываем файлы для чтения.
  sFile = open(solutionResultFile, mode="r")
  aFile = open(answerFile, mode="r")
  
  # Преобразуем полученные значения в строки.
  a = aFile.readline().strip()
  s = sFile.readline().strip()
  
  # Проверяем равенство значений переменных a и s.
  if (a == s):
    # Если значения равны, возвращаем вердикт OK.
    print('1 OK')
    sys.exit(0)
  else:
    # Если значения не равны, возвращаем вердикт WA и текст ошибки.
    print('0 WA')
    print(f"{s} != {a}")
    sys.exit(1)
  ```
  
  {% endcut %}

{% endlist %}


## Настройка чекера {#to-set-checker}

Вы можете изменить следующие параметры:

#|
|| **Параметр** | **Описание**||
||**Тип чекера**| 

<!-- source: ru/_includes/reusables/id-reusables/checker-type-p.md -->
На основе какой системы был загружен чекер. Возможные значения:
- **STANDARD_CHECKER**&nbsp;— стандартный чекер Контеста. Выбран по умолчанию.
- **EJUDGE_EXITCODE_CHECKER**&nbsp;— оперирует кодами возврата системы [Ejudge](https://ejudge.ru/wiki/index.php/Serve.cfg:problem:scoring_checker).
- **TESTLIB_EXITCODE_CHECKER**&nbsp;— оперирует кодами возврата библиотеки [testlib](https://github.com/MikeMirzayanov/testlib).
- **TESTLIB_CHECKER**&nbsp;— оперирует кодами возврата библиотеки [ testlib для Pascal](https://olympiads.ru/school/system/testlib/testlib.shtml).
После успешной компиляции в этом поле будет указано значение, выбранное при загрузке файла чекера.
<!-- endsource: ru/_includes/reusables/id-reusables/checker-type-p.md -->

||
||**ID чекера**|

<!-- source: ru/_includes/reusables/id-reusables/only-for-standard.md -->
Только для типа **STANDARD_CHECKER**.
<!-- endsource: ru/_includes/reusables/id-reusables/only-for-standard.md -->

<!-- source: ru/_includes/reusables/id-reusables/standart-checkers-p.md -->
Название встроенного чекера. В Контесте используются стандартные чекеры других систем и собственные: 

{% cut "Стандартные проверяющие программы" %}


- **fcmp**&nbsp;— сравнивает файлы построчно, игнорирует пробелы на концах строк.
- **hcmp**&nbsp;— сравнивает два целых числа со знаком любой длины.
- **icmp**&nbsp;— сравнивает два 32-битных целых числа со знаком.
- **lcmp**&nbsp;— сравнивает файлы в виде последовательностей токенов в строках.
- **ncmp**&nbsp;— сравнивает последовательности 32-битных целых чисел со знаком.
- **rncmp**&nbsp;— сравнивает два вещественных числа с максимальной абсолютной погрешностью $1,5\times10^{-5}$.
- **rncmpN**&nbsp;— сравнивает два вещественных числа с максимальной абсолютной погрешностью $10^{-N}$.
- **wcmp**&nbsp;— сравнивает файлы, игнорируя лишние пробелы и переносы между словами.
- **yesno**&nbsp;— сравнивает два ответа `YES` или `NO` независимо от регистра.
- **cmp_file**&nbsp;— построчно сравнивает два файла. Выбран по умолчанию.
- **cmp_file_nospace**&nbsp;— сравнивает два файла с игнорированием повторяющихся пробелов.
- **cmp_bytes**&nbsp;— побайтово сравнивает два файла.
- **cmp_int**&nbsp;— сравнивает два 32-битных целых числа со знаком.
- **cmp_int_seq**&nbsp;— сравнивает две последовательности 32-битных целых чисел со знаком.
- **cmp_long_long**&nbsp;— сравнивает два 64-битных целых числа со знаком.
- **cmp_long_long_seq**&nbsp;— сравнивает две последовательности 64-битных целых чисел со знаком.
- **cmp_unsigned_int**&nbsp;— сравнивает два 32-битных целых числа без знака.
- **cmp_unsigned_int_seq**&nbsp;— сравнивает две последовательности 32-битных целых чисел без знака.
- **cmp_unsigned_long_long**&nbsp;— сравнивает два 64-битных целых числа без знака.
- **cmp_unsigned_long_long_seq**&nbsp;— сравнивает две последовательности 64-битных целых чисел без знака.
- **cmp_huge_int**&nbsp;— сравнивает два целых числа произвольного размера.
- **cmp_double**&nbsp;— сравнивает два вещественных числа двойной точности с заданной максимальной ошибкой.
- **сmp_double_seq**&nbsp;— сравнивает две последовательности вещественных чисел двойной точности с заданной максимальной ошибкой.
- **cmp_long_double**&nbsp;— сравнивает два вещественных числа расширенной точности с заданной максимальной ошибкой.
- **cmp_long_double_seq**&nbsp;— сравнивает две последовательности вещественных чисел расширенной точности с заданной максимальной ошибкой.
- **cmp_sexpr**&nbsp;— сравнивает два S-выражения в синтаксисе языка Lisp.
- **cmp_yesno**&nbsp;— сравнивает два ответа `YES` или `NO` зависимо от регистра.
- **cmp_range**&nbsp;— проверяет наличие ответа в указанном диапазоне с максимальной абсолютной погрешностью $10^{-8}$.


{% endcut %}

{% cut "Проверяющие программы Контеста" %}


- **ok**&nbsp;— всегда возвращает `ОК`. Полезен для [интерактивных](https://admin.contest.yandex.ru/docs/ru/examples/interactive.md) и [Make](https://admin.contest.yandex.ru/docs/ru/examples/advanced-usage/default-tests-for-language.md)-задач.
- **rangencmp**&nbsp;— проверяет наличие ответа в заданном интервале. В качестве правильного ответа принимает файл с двумя вещественными числами&nbsp;— минимальный и максимальный возможный ответ. В качестве ответа участника ожидается файл с одним вещественным числом.
- **regexcmp**&nbsp;— сравнивает ответ участника с [регулярным выражением](https://en.cppreference.com/w/cpp/regex/ecmascript). В качестве правильного ответа принимается файл с регулярным выражением.
- **anycmp**&nbsp;— проверяет наличие ответа участника в указанных строках. В качестве правильного ответа принимается файл, в котором каждая строка является правильным вариантом ответа. В качестве ответа участника принимается файл с одной строкой.


{% endcut %}
<!-- endsource: ru/_includes/reusables/id-reusables/standart-checkers-p.md -->

||
||**Чекер выставляет баллы**|

<!-- source: ru/_includes/reusables/id-reusables/only-for-ejudge-testlib.md -->
Только для типов **EJUDGE_EXITCODE_CHECKER** и **TESTLIB_EXITCODE_CHECKER**.
<!-- endsource: ru/_includes/reusables/id-reusables/only-for-ejudge-testlib.md -->

<!-- source: ru/_includes/reusables/id-reusables/checker-points.md -->
Добавить чекеру возможность возвращать баллы за тест.
<!-- endsource: ru/_includes/reusables/id-reusables/checker-points.md -->

||
||**Ограничение по времени**|

<!-- source: ru/_includes/reusables/id-reusables/max-time-checker.md -->
Максимальное время запуска чекера.
<!-- endsource: ru/_includes/reusables/id-reusables/max-time-checker.md -->

<!-- source: ru/_includes/reusables/id-reusables/after-time-crash.md -->
После указанного времени решение получит вердикт `«не удалось протестировать» (Crash)`.
<!-- endsource: ru/_includes/reusables/id-reusables/after-time-crash.md -->

||
||**Ограничение по времени ожидания**|

<!-- source: ru/_includes/reusables/id-reusables/max-wait-checker.md -->
Максимальное время ожидания при запуске чекера.
<!-- endsource: ru/_includes/reusables/id-reusables/max-wait-checker.md -->

<!-- source: ru/_includes/reusables/id-reusables/after-time-crash.md -->
После указанного времени решение получит вердикт `«не удалось протестировать» (Crash)`.
<!-- endsource: ru/_includes/reusables/id-reusables/after-time-crash.md -->

||
||**Ограничение памяти**|

<!-- source: ru/_includes/reusables/id-reusables/max-om-checker.md -->
Максимальный объем оперативной памяти, который может использоваться при запуске чекера.
<!-- endsource: ru/_includes/reusables/id-reusables/max-om-checker.md -->

<!-- source: ru/_includes/reusables/id-reusables/after-value-crash.md -->
При превышении значения решение получит вердикт `«не удалось протестировать» (Crash)`.
<!-- endsource: ru/_includes/reusables/id-reusables/after-value-crash.md -->

||
||**Ограничение на объем вывода**|

<!-- source: ru/_includes/reusables/id-reusables/max-stream-data-checker.md -->
Максимальное количество данных в потоке вывода во время работы чекера.
<!-- endsource: ru/_includes/reusables/id-reusables/max-stream-data-checker.md -->

<!-- source: ru/_includes/reusables/id-reusables/after-value-crash.md -->
При превышении значения решение получит вердикт `«не удалось протестировать» (Crash)`.
<!-- endsource: ru/_includes/reusables/id-reusables/after-value-crash.md -->

||
||**Окружение** |

<!-- source: ru/_includes/reusables/id-reusables/only-for-ejudge-and-two-testlibs.md -->
Только для типов **EJUDGE_EXITCODE_CHECKER**, **TESTLIB_EXITCODE_CHECKER** и **TESTLIB_CHECKER**.
<!-- endsource: ru/_includes/reusables/id-reusables/only-for-ejudge-and-two-testlibs.md -->

<!-- source: ru/_includes/reusables/id-reusables/environment-checker.md -->
Окружение с выбранным компилятором будет использовано для запуска чекера.

Опцию **Legacy** можно заменить на другую, но после изменения вернуться к ней будет невозможно.
<!-- endsource: ru/_includes/reusables/id-reusables/environment-checker.md -->

<!-- source: ru/_includes/reusables/id-reusables/environment-success.md -->
После успешной компиляции в этом поле будет указано значение, выбранное в поле **Компилятор**.
<!-- endsource: ru/_includes/reusables/id-reusables/environment-success.md -->

||
||**Файлы чекера**|

<!-- source: ru/_includes/reusables/id-reusables/only-for-ejudge-and-two-testlibs.md -->
Только для типов **EJUDGE_EXITCODE_CHECKER**, **TESTLIB_EXITCODE_CHECKER** и **TESTLIB_CHECKER**.
<!-- endsource: ru/_includes/reusables/id-reusables/only-for-ejudge-and-two-testlibs.md -->

<!-- source: ru/_includes/reusables/id-reusables/files-checkers.md -->
Добавить файлы, необходимые для корректной работы чекера. Первым добавляйте его скомпилированный исполняемый файл.
<!-- endsource: ru/_includes/reusables/id-reusables/files-checkers.md -->
||
|#

## Полезные ссылки {#helpdul-links}

* Библиотека tetlib.h на Github с примерами:

    * [На С++](https://github.com/MikeMirzayanov/testlib)
    * [На Python](https://github.com/atolstikov/testlib/tree/master)
    
- [Блог Чекеры, testlib.h и просто по теме в Codeforces](http://codeforces.com/blog/entry/1292)&nbsp;— описание работы чекеров и как их создавать.
    
<!-- source: ru/_includes/reusables/support-button.md -->
<a href="../../troubleshooting">
  <span class="button">Написать в службу поддержки</span>
</a>



<!-- endsource: ru/_includes/reusables/support-button.md -->
