Hello, CodeForces!
Information
I have written a test generator in C++. It is very simple, it contains 2 functions: "generate a random number between $$$a$$$ and $$$b$$$, so that this random number is a multiple of $$$k$$$" (function: genint(a, b, k, add)
, where add
is whether to "add" this number to the test) and "generate of a random string". There's something to be written here.
- Generates a string of random length between $$$a$$$ and $$$b$$$, so that it is a multiple of $$$k$$$.
- Consisting of the given characters. You can set characters in two ways: write the interval
("a-f", "x-z")
or a individual character("m", "o")
. (function:genstr(a, b, k, pattern, add)
, wherepattern
is an array of given intervals or individual characters).
Usage
Есть такая задача: Вам дана строка состоящая из $$$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++) { // generates 5 tests
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
Заключение
Этот генератор подойдет и для стресс тестирования. Генерировать тесты в задаче обычно не очень сложно. Подойдет он и для взломов. Можно очень легко сгенерировать "максимальный" тест.