Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Problem name : Autumn Leaves
- // to do
- #include <bits/stdc++.h>
- using namespace std;
- #define all(v) v.begin(),v.end()
- string affectedFiles = "Affected Files are :\n";
- char slug[200];
- struct MetaData { // done
- string tcValue; // Hand made cases
- int n; // if 0, don't process it
- int q;
- int percentage;
- int min_leaves;
- int max_leaves;
- int max_days;
- int min_segment_length;
- int max_segment_length;
- int seed;
- int code;
- MetaData (
- string _tcValue = "",
- int _n = 0,
- int _q = 0,
- int _percentage = 0,
- int _min_leaves = 0,
- int _max_leaves = 0,
- int _max_days = 0,
- int _min_segment_length = 0,
- int _max_segment_length = 0,
- int _seed = 12345,
- int _code = 0
- ) {
- tcValue = _tcValue;
- n = _n;
- q = _q;
- percentage = _percentage;
- min_leaves = _min_leaves;
- max_leaves = _max_leaves;
- max_days = _max_days;
- min_segment_length = _min_segment_length;
- max_segment_length = _max_segment_length;
- seed = _seed;
- code = _code;
- }
- };
- /*
- void gen0(MetaData data) { // done (may need debugging)
- auto values = bind(std::uniform_int_distribution<int>(1,123 * 456),
- mt19937(data.seed));
- int seed_leaves = values();
- auto leaves = bind(std::uniform_int_distribution<int>(1,data.max_leaves),
- mt19937(seed_leaves));
- int seed_start = values();
- auto start = bind(std::uniform_int_distribution<int>(1,data.n),
- mt19937(seed_start));
- int seed_segment = values();
- auto segment = bind(std::uniform_int_distribution<int>(1,data.max_segment_length),
- mt19937(seed_segment));
- int seed_days = values();
- auto days = bind(std::uniform_int_distribution<int>(1,data.max_days),
- mt19937(seed_days));
- int n = data.n;
- int q = data.q;
- int perc = data.percentage;
- cout << n << endl;
- for(int i=0;i<n;i++)
- cout << leaves() << endl;
- cout << perc << endl;
- cout << q << endl;
- for(int i=0;i<q;i++)
- cout << days() << endl;
- vector<int> starting(q);
- for(int i=0;i<q;i++)
- starting[i] = start();
- vector<int> lengths(q);
- for(int i=0;i<q;i++)
- lengths[i] = segment();
- cout << q << endl;
- for(int i=0;i<q;i++)
- cout << starting[i] << endl;
- cout << q << endl;
- for(int i=0;i<q;i++)
- cout << min(starting[i] + lengths[i], n) << endl;
- }
- */
- void gen0(MetaData data) { // done (may need debugging)
- auto values = bind(std::uniform_int_distribution<int>(1,123 * 456),
- mt19937(data.seed));
- int seed_leaves = values();
- auto leaves = bind(std::uniform_int_distribution<int>(data.min_leaves,data.max_leaves),
- mt19937(seed_leaves));
- int seed_start = values();
- auto start = bind(std::uniform_int_distribution<int>(1,data.n - data.min_segment_length),
- mt19937(seed_start));
- int seed_segment = values();
- auto segment = bind(std::uniform_int_distribution<int>(data.min_segment_length,data.max_segment_length),
- mt19937(seed_segment));
- int seed_days = values();
- auto days = bind(std::uniform_int_distribution<int>(1,data.max_days),
- mt19937(seed_days));
- int n = data.n;
- int q = data.q;
- int perc = data.percentage;
- cout << n << endl;
- for(int i=0;i<n;i++)
- cout << leaves() << endl;
- cout << perc << endl;
- cout << q << endl;
- for(int i=0;i<q;i++) {
- if (values() % 2 == 0)
- cout << days() << endl;
- else
- cout << days() % 20 + 1 << endl;
- }
- vector<int> starting(q);
- for(int i=0;i<q;i++)
- starting[i] = start();
- vector<int> lengths(q);
- for(int i=0;i<q;i++)
- lengths[i] = segment();
- cout << q << endl;
- for(int i=0;i<q;i++)
- cout << starting[i] << endl;
- cout << q << endl;
- for(int i=0;i<q;i++)
- cout << min(starting[i] + lengths[i], n) << endl;
- }
- void createTest(char* testId, MetaData data) { // done
- typedef void (*fn)(MetaData);
- static vector<fn> functions = {gen0};
- assert (data.code >= 0 && data.code < (int)functions.size());
- char outputPath[500] = {0};
- strcat(strcat(strcat(outputPath, "testcases/input/input"), testId), ".txt");
- freopen(outputPath, "w", stdout);
- functions[data.code](data);
- fclose(stdout);
- }
- void createOutput(char* testId) { // done
- char command[500] = {0};
- strcat(strcat(strcat(strcat(strcat(strcat(command, "time ./a < testcases/input/input"), testId), ".txt > "), "testcases/output/output"), testId), ".txt");
- system(command);
- }
- bool createTestAndOutput(char* testId, MetaData data) { // done
- // handmade cases
- if ((int)data.tcValue.length() > 0) {
- char outputPath[500] = {0};
- strcat(strcat(strcat(outputPath, "testcases/input/input"), testId), ".txt");
- freopen(outputPath, "w", stdout);
- cout << data.tcValue;
- fclose(stdout);
- createOutput(testId);
- affectedFiles += testId;
- affectedFiles += "\n";
- return 1;
- }
- // when there are less than 15 test cases
- if (data.n == 0)
- return 0;
- // run the generator
- createTest(testId, data);
- createOutput(testId);
- affectedFiles += testId;
- affectedFiles += "\n";
- return 1;
- }
- void initialize() { // done
- system("rm -r testcases/input");
- system("rm -r testcases/output");
- system("mkdir -p testcases/input");
- system("mkdir -p testcases/output");
- }
- void run(char* testId, MetaData data) { // done
- if (createTestAndOutput(testId, data)) {
- freopen ("/dev/tty", "a", stdout);
- cout << "Test case " << testId << " processed" << endl;
- cout << endl;
- fclose(stdout);
- }
- }
- void warnBeforeRunningGenerator() { // done
- char c;
- cout << "(i/I)nitialize_and_run or run normally? ";
- c = getchar();
- int warn = 3;
- if (c == 'i' || c == 'I') {
- getchar();
- cout << "You pressed i/I" << endl;
- for(int i=0;i<warn;i++) {
- cout << "Proceed with initialize? It will delete all the files (" << warn-1-i << "): ";
- getchar();
- }
- cout << slug << endl;
- initialize();
- }
- else {
- for(int i=0;i<warn;i++) {
- cout << "Proceed with run? It will delete old files (" << warn-1-i << "): ";
- getchar();
- }
- cout << slug << endl;
- }
- }
- int main() { // only data remains to be written
- MetaData data[15];
- time_t _tm = time(NULL);
- struct tm * curtime = localtime ( &_tm );
- char buf[100] = {0};
- strcat(strcat(buf, "Last modified : "), asctime(curtime));
- strcpy(slug, buf);
- string sample_testcase_0 = "5\n10\n20\n30\n20\n10\n30\n3\n1\n1\n2\n3\n2\n1\n1\n3\n4\n3\n4\n";
- string sample_testcase_1 = "5\n10\n20\n30\n20\n10\n30\n3\n1\n2\n3\n3\n1\n1\n1\n3\n5\n5\n5\n";
- int seeds[] = {23526, 427628, 136829, 25360, 4267582,
- 5729263, 5262789, 263726, 2238, 277299,
- 63828, 864778, 37897, 98789, 789800};
- // Hand made cases : 2 // done
- data[0] = MetaData (
- /*tcval = */ sample_testcase_0
- );
- data[1] = MetaData (
- /*tcval = */ sample_testcase_1
- );
- /*
- code 0
- */
- data[2] = MetaData (
- /*tcval = */ "",
- /*n = */ 10,
- /*q = */ 10,
- /*percentage = */ 40,
- /*min_leaves = */ 1,
- /*max_leaves = */ 1000,
- /*max_days = */ 5,
- /*min_seg = */ 1,
- /*max_seg = */ 10,
- /*seed = */ seeds[2],
- /*code = */ 0
- );
- data[3] = MetaData (
- /*tcval = */ "",
- /*n = */ 1000,
- /*q = */ 1000,
- /*percentage = */ 30,
- /*min_leaves = */ 1,
- /*max_leaves = */ 1000 * 1000,
- /*max_days = */ 5,
- /*min_seg = */ 1,
- /*max_seg = */ 1000,
- /*seed = */ seeds[3],
- /*code = */ 0
- );
- data[4] = MetaData (
- /*tcval = */ "",
- /*n = */ 1000,
- /*q = */ 1000,
- /*percentage = */ 50,
- /*min_leaves = */ 1,
- /*max_leaves = */ 1000 * 1000,
- /*max_days = */ 7,
- /*min_seg = */ 1,
- /*max_seg = */ 1000,
- /*seed = */ seeds[4],
- /*code = */ 0
- );
- data[5] = MetaData (
- /*tcval = */ "",
- /*n = */ 100000,
- /*q = */ 100000,
- /*percentage = */ 30,
- /*min_leaves = */ 1000 * 1000,
- /*max_leaves = */ 1000 * 1000 * 1000,
- /*max_days = */ 1000 * 1000 * 1000,
- /*min_seg = */ 1000,
- /*max_seg = */ 100000,
- /*seed = */ seeds[5],
- /*code = */ 0
- );
- data[6] = MetaData (
- /*tcval = */ "",
- /*n = */ 100000,
- /*q = */ 100000,
- /*percentage = */ 40,
- /*min_leaves = */ 1000 * 1000,
- /*max_leaves = */ 1000 * 1000 * 1000,
- /*max_days = */ 50,
- /*min_seg = */ 1000,
- /*max_seg = */ 100000,
- /*seed = */ seeds[6],
- /*code = */ 0
- );
- data[7] = MetaData (
- /*tcval = */ "",
- /*n = */ 100000,
- /*q = */ 100000,
- /*percentage = */ 40,
- /*min_leaves = */ 1000 * 1000,
- /*max_leaves = */ 1000 * 1000 * 1000,
- /*max_days = */ 5 * 1000 * 1000,
- /*min_seg = */ 1000,
- /*max_seg = */ 100000,
- /*seed = */ seeds[7],
- /*code = */ 0
- );
- data[8] = MetaData (
- /*tcval = */ "",
- /*n = */ 100000,
- /*q = */ 100000,
- /*percentage = */ 50,
- /*min_leaves = */ 5 * 1000 * 1000,
- /*max_leaves = */ 1000 * 1000 * 1000,
- /*max_days = */ 50,
- /*min_seg = */ 1000,
- /*max_seg = */ 100000,
- /*seed = */ seeds[8],
- /*code = */ 0
- );
- data[9] = MetaData (
- /*tcval = */ "",
- /*n = */ 100000,
- /*q = */ 100000,
- /*percentage = */ 60,
- /*min_leaves = */ 5 * 1000 * 1000,
- /*max_leaves = */ 1000 * 1000 * 1000,
- /*max_days = */ 5 * 1000,
- /*min_seg = */ 1000,
- /*max_seg = */ 100000,
- /*seed = */ seeds[9],
- /*code = */ 0
- );
- data[10] = MetaData (
- /*tcval = */ "",
- /*n = */ 100000,
- /*q = */ 100000,
- /*percentage = */ 37,
- /*min_leaves = */ 5 * 1000 * 1000,
- /*max_leaves = */ 1000 * 1000 * 1000,
- /*max_days = */ 1000 * 1000 * 1000,
- /*min_seg = */ 1000,
- /*max_seg = */ 100000,
- /*seed = */ seeds[10],
- /*code = */ 0
- );
- data[11] = MetaData (
- /*tcval = */ "",
- /*n = */ 100000,
- /*q = */ 100000,
- /*percentage = */ 67,
- /*min_leaves = */ 5 * 1000 * 1000,
- /*max_leaves = */ 1000 * 1000 * 1000,
- /*max_days = */ 1000 * 1000 * 1000,
- /*min_seg = */ 1000,
- /*max_seg = */ 100000,
- /*seed = */ seeds[11],
- /*code = */ 0
- );
- data[12] = MetaData (
- /*tcval = */ "",
- /*n = */ 100000,
- /*q = */ 100000,
- /*percentage = */ 100,
- /*min_leaves = */ 5 * 1000 * 1000,
- /*max_leaves = */ 1000 * 1000 * 1000,
- /*max_days = */ 1000 * 1000 * 1000,
- /*min_seg = */ 1000,
- /*max_seg = */ 100000,
- /*seed = */ seeds[12],
- /*code = */ 0
- );
- warnBeforeRunningGenerator();
- run("00", data[0]);
- run("01", data[1]);
- run("02", data[2]);
- run("03", data[3]);
- run("04", data[4]);
- run("05", data[5]);
- run("06", data[6]);
- run("07", data[7]);
- run("08", data[8]);
- run("09", data[9]);
- run("10", data[10]);
- run("11", data[11]);
- run("12", data[12]);
- run("13", data[13]);
- run("14", data[14]);
- //freopen("generator_report.txt", "w", stdout);
- freopen ("/dev/tty", "a", stdout);
- cout << affectedFiles << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement