CarYon: генератор тестовых данных OI / ACM на основе C ++

Revision ru1, by luosw, 2020-07-31 08:59:27

CarYon: генератор тестовых данных OI / ACM на основе C ++

img img ![](https://img.shields.io/npm/dm/datamaker-caryon) ![](https://img.shields.io/npm/dt/datamaker-caryon)  ![](https://img.shields.io/npm/v/datamaker-caryon)

Предисловие

Для чего это?

При проведении своего собственного конкурса OI, вы столкнулись со следующими проблемами

  • Хотите быстро сгенерировать абзац текста?
  • Хотите быстро выполнить математические операции для генерации данных?
  • Хотите генерировать тестовые данные по очереди, не дожидаясь freopen?
  • Хотите сгенерировать набор случайных данных или рядов?
  • Быстро генерировать данные для соответствия двум программам?

Затем вы можете использовать CarYon и C ++ для быстрой генерации данных. В настоящее время поддерживаются следующие функции:

  • Случайно генерировать абзац, несколько слов, несколько букв
  • Без ограничений RAND_MAX, свободно составлять случайные числа Разрабатываемая математическая библиотека поддерживает несколько функций
  • Создайте несколько кругов, правильных многоугольников и дробей и используйте их для расчетов

Выполните test.cpp для создания надежных данных в течение 1 минуты

Я надеюсь, что вы все можете помочь улучшить этот проект. Надеюсь, что этот проект поможет всем сэкономить время!

что-то не так?

Перейдите в репозиторий Github, чтобы опубликовать вопрос, чтобы задать вопросы, и вы можете опубликовать эту статью.

Мой номер Луогу: luosw

Инструкции по использованию

Как установить?

установка npm (стабильная версия)

Вы можете перейти в репозиторий GitHub, чтобы загрузить последнюю версию, ссылка находится в следующем заголовке, и ее также можно использовать с установленным node-js:

$ npm install datamaker-caryon --save

Установите стабильную версию этого генератора данных.

GitHub репозиторий (последняя версия)

https://github.com/luosiwei-cmd/caryon

Пожалуйста, не забудьте пометить ~

exe установка (стабильная версия)

Посетите http://luosw.fun/caryon/caryon-setup.exe, чтобы загрузить установочный пакет, запустить установочный пакет, в установочном каталоге (по умолчанию C: // Program Files (x86) / CarYon) вы можете найти соответствующий caryon.h файл.

Генерация данных

Следующие основные операции должны включать файл заголовка caryon.h. Обратите внимание, что папка каталога программы должна содержать файлcaryon.h.gch, сгенерированный после того, как файл заголовка скомпилирован перед использованием генератора данных.

makein (1,10) {
    csh();
ххххх;
}

Эта операция используется для генерации файла: 1.in-10.in, вы можете свободно изменять два параметраmakein для замены. Например, makein (3,5) сгенерирует 3.in-5.in.

Когда мы выполним test.cpp, мы обнаружим, что в корневом каталоге есть дополнительная папка, которая содержит файлы из1.in ~ 10.in, что является результатом изготовления.

csh(); Команда не должна быть изменена или заменена!

Последующий:

dataname = "";

Это необходимо для заполнения префикса, такого как следующая программа:

#include "caryon.h"
using namespace  std;
using namespace ca;
int main () {
  dataname = "chen_zhe-ак-ioi";
  makein (1,10) {
    csh();
    ххх;
  }
}

Он сгенерирует chen_zhe-ak-ioi1.in ~ chen_zhe-ak-ioi10.in в папкеdata-chen_zhe-ak-ioi в корневом каталоге.

**Обратите внимание, что из-за новой версии пробелы не могут появляться в поле dataname! ! **

После того, как все наши вещи сделаны, не забудьте использовать

closefile ();

Функция для освобождения места в памяти. (Эффект похож на fclose, вам не нужно его писать)

Мы научились создавать в файлах, как создавать соответствующие файлы? Давайте обогатим предыдущий пример:

#include "caryon.h"
using namespace std;
using namespace ca;
int main () {
  dataname = "chen_zhe-ак-ioi";
  makein (1,10) {
        csh();
        ххх;
     }
  makeout (1,10);
}

В это время в каталоге, где находится test.cpp, должен быть файлstd.exe, который обычно называют стандартной программой. Обратите внимание, что стандартной программой должен быть скомпилированный файл std.exe, прежде чем можно будет создать соответствующий файл out.

Давайте создадим случайное число ниже:

cyrand (а, b);

Его функция — возвращать случайное число между a иb.

MT19337 (или метод вращения Мейсона), используемый этим случайным числом, преодолевает ограничение RAND_MAX, которое поставляется с C ++.

(Если вы хотите сгенерировать случайное число в диапазоне «long long», используйте cyrand_ll ()).

Давайте посмотрим, как хранить целочисленные переменные во входном файле:

inint ();
instring ("");

Обе эти функции используются для ввода данных в файл in. Если мы хотим ввести случайное число, мы пишем:

inint (cyrand ());

Вот и все.

Например, следующая программа:

#include "caryon.h"
using namespace std;
using namespace ca;
int main () {
    dataname = "test";
    makein (1,10) {
        csh();
        inint (cyrand (0100));
    }
}

Вы найдете файл test1.in-test10.in в папке data-test в каталоге. Откройте эти файлы с помощью Блокнота, и вы найдете случайное число в каждом файле.

Если вы не знаете, как открыть файл in и файлout с помощью Блокнота, щелкните правой кнопкой мыши файл и выберите Открыть метод, чтобы найти свой Блокнот. Или вы можете использовать Dev-C ++, открыть программное обеспечение и перетащить в него файл in.

Для этой программы, если мы напишем std.cpp так:

#include <bits/stdc++.h>
using namespace std;
int main () {
    int a;
    cin >> а;
    cout << а + 10;
    return 0;
}

После компиляции измените test.cpp на:

#include "caryon.h"
using namespace std;
using namespace ca;
int main () {
    dataname = "test";
    makein (1,10) {
        csh();
        inint (cyrand (0100));
    }
    makeout (1,10);
}

Затем используйте Блокнот, чтобы открыть файлы in иout соответственно, и вы можете обнаружить, что это результат добавления $$$ 10 $$$ к числу каждого файла in.

Благодаря поддержке функций новой версии, при создании файла будет отображаться подсказка, поэтому вам не нужно беспокоиться о том, какой черный ящик продолжает прыгать и прыгать!

Так работает весь генератор данных.

Мы также можем генерировать много случайных вещей, таких как:

cyrand_bool (); // Случайное логическое значение
cyrand_engs (); // Случайные английские строчные буквы
cyrand_engb (); // Случайные английские заглавные буквы
cyrand_formatc (); // случайный escape-символ
cyrand_word (a); // Случайное слово длины a
cyrand_article (a); // Случайный абзац со словарем
cyrand_letter (); // Случайные символы

Эти вещи можно использовать, чтобы представить себе DIY и достичь желаемого эффекта.

Соответствие программы

В ходе конкурса для проверки правильности алгоритма низкой сложности мы обычно используем другой алгоритм низкого уровня для решения той же проблемы, а затем используем большую выборку для сравнения сгенерированных результатов двух программ.

Теперь CarYon наконец-то поддерживает функцию съемки! ! !

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

  1. Напишите myprogram.cpp в текущем каталоге и скомпилируйте его в файлmyprogram.exe;
  2. Напишите test.cpp иstd.cpp в соответствии с модулем генерации данных;
  3. Добавьте строку после test.cpp:
debug(/ * начало * /, / * конец * /);

Например, вы уверенно отправляете свои высокоточные a + b. В настоящее время вам необходимо сопоставить вашу программу с низкими значениями точности.

Сначала поместите следующую высокоточную версию a + b в ваш myprogram.cpp и скомпилируйте ее в myprogram.exe:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	string a,b;
	int xa[500]={},xb[500]={},tot[500]={};
	cin>>a>>b;
	for(int i=0;i<a.length();i++)
		xa[i]=a[a.length()-i-1]-'0';
	for(int i=0;i<b.length();i++)
		xb[i]=b[b.length()-i-1]-'0';
	int len=max(a.length(),b.length());
	for(int i=0;i<len;i++)
		tot[i]=xa[i]+xb[i];
	for(int i=0;i<len;i++)
	{
		tot[i+1]+=tot[i]/10;
		tot[i]%=10;
	}
	if(tot[len]) cout<<tot[len];
	for(int i=len-1;i>=0;i--)
		cout<<tot[i];
	cout<<endl;
}

Затем заполните простейшие a + b вstd.cpp;

И напишите test.cpp так:

#include "caryon.h"
// Уже включаем универсальные заголовочные файлы
using namespace  std;
using namespace имен ca; // Namespace


int main () {
  dataname = "a+btest"; // Напишите здесь свой префикс
  makein (1,10) {
    csh ();
    / * Пожалуйста, посмотрите здесь документ на использование и два тестовых примера самостоятельно * /
  }
  makeout(/ * начало * /, / * количество раз * /);
   debug (/ * start * /, / * количество раз * /); // команда соответствия программы, вам не нужно писать
// Значение makeout должно быть меньше или равно makein
// Пожалуйста, скомпилируйте std и поместите его в эту папку, там должен быть exe-файл
	//Спасибо за Вашу поддержку
  return 0;
}

Обратите внимание, что из-за новой версии пробелы не могут появляться в поле dataname! ! !

После запуска можно обнаружить не только папку data-a + btest, но такжеa+btest1.in / out-a + btest10.in / out, но и новую папку debug-a + btest folder, inside — это выводa + btest1.ans-a + b10.ans с помощью myprogram.exe, и затем вы можете использовать функцию comp в cmd, чтобы сравнить размер этих двух файлов!

test.cpp Инструкция по применению

Исходная информация test.cpp в корневой директории выглядит следующим образом:

#include "caryon.h"
// Уже включаем универсальные заголовочные файлы
using namespace  std;
using namespace имен ca; // Namespace

int main () {
  dataname = ""; // Напишите здесь свой префикс
  makein (1,10) {
    csh();
    / * Пожалуйста, посмотрите здесь документ на использование и два тестовых примера самостоятельно * /
  }
  makeout(/ * начало * /, / * количество раз * /);
  debug (/ * start * /, / * количество раз * /); // команда соответствия программы, вам не нужно писать
// Значение makeout должно быть меньше или равно makein
// Пожалуйста, скомпилируйте std и поместите его в эту папку, там должен быть exe-фай
//Спасибо за Вашу поддержку
  return 0;
}

Помните, что не следует менять общую структуру программы, иначе у ваших результатов выполнения будут проблемы

  1. dataname — это префикс входных и выходных файлов, если вы оставите это поле пустым, префикса не будет;
  2. Число раз в makein () — количество сгенерированных файлов;
  3. csh; в makein не должен быть изменен. При изменении произойдут неизвестные ошибки;
  4. Количество раз в makeout должно быть меньше, чем вmakein, и по умолчанию формируются файлы out, начиная сprefix 1.in, что можно продолжить.

Перед запуском программы обязательно поместите файл std exe в ту же папку.

Генерируем a + b проблемные данные test.cpp пишем демонстрацию

#include "caryon.h"
// Уже включаем универсальные заголовочные файлы
using namespace std;
using namespace ca; // Namespace


int main () {
  dataname = "a+b test"; // Напишите здесь свой префикс
  makein (1,10) {
    csh();
    inint (cyrand (-1000,1000));
    instring ("");
    inint (cyrand (-1000,1000));
  }
  makeout (1,10);
  return 0;
}

Объяснение: Данные a + b представляют собой два случайных числа (с пробелами между ними), поэтому для добавления пробелов вам необходимо использовать функцию instring (" "); а затем есть два случайных числа.

Для высокоточных данных их можно сгенерировать в следующем цикле:

inint (cyrand (1,9));
for (int i = 0; i <длина высокоточных данных-1; i ++) {
    inint (cyrand (0,9));
}

Вышеуказанная программа может генерировать только высокоточные данные.

Вышеуказанного контента достаточно для генерации данных noip-плееров, поэтому я не буду говорить об этом позже и подожду, пока пользователи сами исследуют. Если у вас есть какие-либо вопросы, пожалуйста, оставьте сообщение на этом интерфейсе, спасибо!

Tags testdata

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
ru1 Russian luosw 2020-07-31 08:59:27 12570 Первая редакция (опубликовано)