Генератор тестов на C++

Revision ru10, by rustam-cpp, 2024-03-14 17:56:58

Привет, CodeForces!

Основная информация

Я написал генератор тестов на C++. Он очень прост, состоит из двух функций: генерация случайного числа в промежутке от $$$a$$$ до $$$b$$$, так, чтобы это случайное число было кратно $$$k$$$ (функция: genint(a, b, k, add), где add — "добавлять" ли в тест это число) и генерация случайной строки. Тут надо расписать:

  • Генерирует строку случайной длины в промежутке от $$$a$$$ до $$$b$$$, так, чтобы она была кратна $$$k$$$.
  • Состоящую из заданных символов. Задавать символы можно двумя способами: написать промежуток ("a-f", "x-z") или конкретный символ ("m", "o"). Функция: genstr(a, b, k, pattern, add), где pattern — массив заданных промежутков или конкретных символов.
Код

Применения

Есть такая задача: Вам дана строка состоящая из $$$n (n \le 10^5)$$$ символов. Вам требуется процент содержания (с точностью до $$$10^{-5}$$$) каждого символа, который есть в строке. Пример ввода и вывода:

Пример

Вам требуется обработать $$$t$$$ наборов входных данных

Для нас, участников соревнования, эта задача очень проста, но для составителей надо написать такие тесты, в которых будут и крайние и обычные случаи. Писать это вручную — плохой вариант. Тем более, что $$$n \le 10^5$$$

С помощью моего генератора можно сделать хорошие тесты в несколько строк:

const int mintestcases = 5;
const int maxtestcases = 8;
const int minlength = 10;
const int maxlength = 20;
for (int i = 0; i < 5; i++) { // генерирует 5 тестов
  string test = "";
  int t = genint(mintestcases, maxtestcases, 1, true);
  test += '\n';
  for (int j = 0; j < t; j++) {
    int n = genint(minlength, maxlength, 5, true);
    test += '\n';
    genstr(n, n, 1, {"a-z"}, true);
    test += '\n';
  }
}
Тесты

Чтобы сделать большие тесты надо увеличить значения mintestcases, maxtestcases, minlength, maxlength. Для претестов можно взять по 1-2 тесту каждого "размера".

Можно генерировать строки состоящие из заглавных букв: genstr(10, 20, 5, {"A-D"}, true), результат: DCABACCCABBBDBD

Можно и сгенерировать строку состоящую из строчных и заглавных букв: genstr(10, 20, 5, {"A-D", "a-d"}, true), результат: DcaBaccCABBBDBD

Заключение

Этот генератор подойдет и для стресс тестирования. Генерировать тесты в задаче обычно не очень сложно. Подойдет он и для взломов. Можно очень легко сгенерировать "максимальный" тест.

Всем удачных раундов и высокого рейтинга, пока!

Tags генератор тестов, test generator

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
ru10 Russian rustam-cpp 2024-03-14 17:56:58 22 Мелкая правка: 'in() {\n // gen' -> 'in() {\n srand(time(NULL));\n // gen'
en10 English rustam-cpp 2024-03-14 17:56:42 22 Tiny change: 'in() {\n // gen' -> 'in() {\n srand(time(NULL));\n // gen'
en9 English rustam-cpp 2024-03-14 17:31:34 2 Tiny change: 'generator in C++. It ' -> 'generator on C++. It '
en8 English rustam-cpp 2024-03-14 17:30:47 9 Tiny change: 'on**\n\nI have written a test ge' -> 'on**\n\nI wrote a test ge'
ru9 Russian rustam-cpp 2024-03-14 17:27:52 0 (опубликовано)
en7 English rustam-cpp 2024-03-14 17:27:34 0 (published)
en6 English rustam-cpp 2024-03-14 17:27:04 7
ru8 Russian rustam-cpp 2024-03-14 17:26:57 7
en5 English rustam-cpp 2024-03-14 17:21:58 1012
ru7 Russian rustam-cpp 2024-03-14 17:21:31 1011
en4 English rustam-cpp 2024-03-14 17:03:03 1751
en3 English rustam-cpp 2024-03-14 16:31:48 13 Tiny change: ' summary="Пример">\n\n~~~~' -> ' summary="Example">\n\n~~~~'
en2 English rustam-cpp 2024-03-14 16:29:54 914
en1 English rustam-cpp 2024-03-14 16:29:28 3377 Initial revision for English translation (saved to drafts)
ru6 Russian rustam-cpp 2024-03-14 16:26:59 182
ru5 Russian rustam-cpp 2024-03-14 16:21:36 353
ru4 Russian rustam-cpp 2024-03-14 16:11:38 824
ru3 Russian rustam-cpp 2024-03-14 16:06:11 1898 Мелкая правка: 'ью до $10^-3$) каждого' -> 'ью до $10^{-3}$) каждого'
ru2 Russian rustam-cpp 2024-03-14 15:52:01 83 Мелкая правка: '======\n\nЯ написал свой генератор тестов.\n\n**Всем' -> '======\n\n\n\n**Всем'
ru1 Russian rustam-cpp 2024-03-14 15:49:08 55 Первая редакция (сохранено в черновиках)